我很难创建带有for循环的函数,该循环将数据框中的列作为数据并根据列名创建不同的图。我已经阅读了SO上的多个相关问题,例, 1:Creating function to use loops with ggplot2 [2]:Looping over variables in ggplot 但到目前为止,对我来说没有任何效果。
样本数据:
<table>
<tr>
<th>Athlete</th>
<th>Seconds</th>
<th>Advance</th>
</tr>
<tr>
<td>A.E.</td>
<td>120</td>
<td class="advance">.</td>
</tr>
<tr>
<td>G.F.</td>
<td>90</td>
<td class="advance">.</td>
</tr>
<tr>
<td>T.L</td>
<td>110</td>
<td class="advance">.</td>
</tr>
</table>
<input type="number">
<button id="btn">
Confirm
</button>
我尝试过的不同代码:
philly_df_new <- structure(list(DATE = structure(c(14610, 14611, 14612, 14613,
14614, 14615, 14616, 14617, 14618, 14619, 14620, 14621, 14622,
14623, 14624, 14625, 14626, 14627, 14628, 14629), class = "Date"),
HOURLYDewPointTempC = c(0, -8.9, -15, -12.2, -11.7, -10.6,
-8.3, -4.4, -12.2, -17.2, -12.8, -6.1, -10.6, -7.8, -5.6,
-2.2, 0.6, 3.9, 0.6, -3.3), HOURLYSeaLevelPressure = c(30,
29.79, 29.78, 29.76, 29.81, 29.78, 29.89, 29.87, 29.98, 30.25,
30.27, 30.13, 30.22, 30.23, 30.21, 30.23, 30.14, 29.49, 29.95,
29.92), DAILYDeptFromNormalAverageTemp = c(-1.7, 2.4, -6.4,
-10.3, -6.2, -5.1, -1, -1, -5.9, -10.8, -11.8, -9.7, -3.7,
-1.7, -1.6, 4.4, 4.4, 6.4, 8.4, 4.3)), .Names = c("DATE",
"HOURLYDewPointTempC", "HOURLYSeaLevelPressure", "DAILYDeptFromNormalAverageTemp"
), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"
))
当我运行第一个函数时,我收到此错误消息
Plot_Graph<-function(x,na.rm=T){
nm=names(x)
for (i in seq_along(nm)) {
print(ggplot(x,aes_string(x="DATE",y=i) +
geom_point()))
}
}
Plot_Graph(philly_df_new)
colNames <- names(philly_df_new)[2:4]
for(i in seq_along(colNames)){
plt <- ggplot(philly_df_new, aes_string(x="DATE", y = i)) +
geom_point(color="#B20000", size=3, alpha=0.5,na.rm = T)
print(plt)
}
aes()Error: Mapping should be created with
aes_()。当我运行第二个函数时,我会得到一条相同的图,并用一条水平线一遍又一遍地绘制图,然后尝试了更多的方法,但出于最小的目的,我将展示这两个图。我想为每个列创建一个时间序列图,如下所示:
答案 0 :(得分:2)
以下作品。
您正在沿 all 列循环,其中包括列"DATE"
,该列应该是x轴,并且循环变量是整数,因此在图表的美观度y = i
是整数,而不是整数列名。
请注意,我致电windows()
打开一个新的图形窗口。如果不需要,请删除它。
Plot_Graph <- function(DF, na.rm = TRUE){
nm = names(DF)[-1]
for (i in nm) {
g <- ggplot(DF, aes(x = DATE, y = get(i))) +
geom_point()
windows()
print(g)
}
}
Plot_Graph(philly_df_new)
答案 1 :(得分:1)
使用cv2.IMREAD_UNCHANGED
的tidyeval
方法的解决方案,需要this answer
首先,我们构建一个将x-和y-列作为输入的函数。请注意rlang::sym
,rlang::quo_name
和!!
的使用。
然后,我们可以使用purrr::map
遍历每一列。
library(rlang)
library(tidyverse)
philly_df_new <- structure(list(DATE = structure(c(14610, 14611, 14612, 14613,
14614, 14615, 14616, 14617, 14618, 14619, 14620, 14621, 14622,
14623, 14624, 14625, 14626, 14627, 14628, 14629), class = "Date"),
HOURLYDewPointTempC = c(0, -8.9, -15, -12.2, -11.7, -10.6,
-8.3, -4.4, -12.2, -17.2, -12.8, -6.1, -10.6, -7.8, -5.6,
-2.2, 0.6, 3.9, 0.6, -3.3), HOURLYSeaLevelPressure = c(30,
29.79, 29.78, 29.76, 29.81, 29.78, 29.89, 29.87, 29.98, 30.25,
30.27, 30.13, 30.22, 30.23, 30.21, 30.23, 30.14, 29.49, 29.95,
29.92), DAILYDeptFromNormalAverageTemp = c(-1.7, 2.4, -6.4,
-10.3, -6.2, -5.1, -1, -1, -5.9, -10.8, -11.8, -9.7, -3.7,
-1.7, -1.6, 4.4, 4.4, 6.4, 8.4, 4.3)), .Names = c("DATE",
"HOURLYDewPointTempC", "HOURLYSeaLevelPressure", "DAILYDeptFromNormalAverageTemp"
), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"
))
# define a function that accept strings as input
Plot_Graph <- function(df, x_var, y_var) {
# convert strings to variable
x_var <- rlang::sym(x_var)
y_var <- rlang::sym(y_var)
# unquote variable using !!
ggplot(df, aes(x = !! x_var, y = !! y_var)) +
geom_point() +
geom_line() +
labs(x = rlang::quo_name(x_var), y = rlang::quo_name(y_var)) +
scale_x_date(breaks = scales::pretty_breaks()) +
theme_classic(base_size = 12)
}
现在遍历每列
plot_list <- colnames(philly_df_new)[-1] %>%
map( ~ Plot_Graph(philly_df_new, "DATE", .x))
plot_list
#> [[1]]
#>
#> [[2]]
#>
#> [[3]]
# Combine all plots
library(cowplot)
do.call(plot_grid, c(plot_list,
align = "v",
axis = 'lr',
nrow = 3))
由ggplot2 v3.0.0
(v0.2.0.9000)创建于2018-08-27。