R &引用;美学必须是“长度”或“长度”;使用ggplot进行过滤时
在R &引用;美学必须是“长度”或“长度”;使用ggplot进行过滤时,r,ggplot2,R,Ggplot2,在ggplot2中绘图之前,我试图根据一些条件筛选数据 当我使用以下命令绘制整个数据集时,一切正常: x_in %>% ggplot(aes(x = x_in$`Turbine Wind Speed Adjusted m/s (m/s)`, y = x_in$`Turbine Power KW (kW)`)) + geom_point() 但是,当我在打印数据之前过滤数据时,出现了一个错误: x_in %>% dplyr::fi
ggplot2
中绘图之前,我试图根据一些条件筛选数据
当我使用以下命令绘制整个数据集时,一切正常:
x_in %>%
ggplot(aes(x = x_in$`Turbine Wind Speed Adjusted m/s (m/s)`,
y = x_in$`Turbine Power KW (kW)`)) +
geom_point()
但是,当我在打印数据之前过滤数据时,出现了一个错误:
x_in %>%
dplyr::filter(`Turbine Wind Speed Adjusted m/s (m/s)`,
`Turbine Power KW (kW)` < 1700) %>%
ggplot(aes(x = x_in$`Turbine Wind Speed Adjusted m/s (m/s)`,
y = x_in$`Turbine Power KW (kW)`)) +
geom_point()
Error: Aesthetics must be either length 1 or the same as the data (34812): x, y
使用
ggplot
的方法是将数据集传递到data=
参数中,然后使用aes
函数定义数据集中变量和绘图中变量之间的映射。例如,如果要绘制cars
数据集,可以执行以下操作:
ggplot(cars, aes(x = speed, y = dist)) +
geom_point()
由于您为aes
提供了一个空白名称,ggplot知道speed
指的是cars
对象中的变量,本质上是cars$speed
,而不是环境中的独立对象。但是,如果您愿意,您可以通过将对象传递给aes
,来覆盖此操作:
cars2 <- cars * 2
ggplot(cars, aes(x = cars2$speed, y = dist)) +
geom_point()
在您的示例中,取x_In
,将其导入filter
,然后将输出导入ggplot
的data=
参数。请注意,管道不会在中编辑x_的值,它只是将输出沿管道传递。因此
中保存的对象x_不会更改。在您的示例中,过滤后的x_版本在中的唯一位置是进入ggplot(data=
但是,当您设置aes
时,您没有传递简单的名称(这将告诉ggplot
在传递到data=
的数据框中查找这些变量),而是指定了一个特定的对象:
aes(x = x_in$`Turbine Wind Speed Adjusted m/s (m/s)` ...
由于您在$
中指定了x_,因此ggplot将在环境中的x_in
对象中使用`涡轮机风速…`
变量,该对象未经筛选,因此其行数与ggplot
预期使用的数据不同
要解决这个问题,只需从aes
中删除x_in$
,这样ggplot就能正确使用您输入的数据。您可以使用dput(x_in)共享数据吗
?如果使用不带空格或特殊字符的列名,您的生活会更愉快。像您这样冗长复杂的列名既尴尬又困难。第二,在aes()中指定美学时
,您永远不应该使用$
,就像在数据$column
中一样。aes()
的要点是您只需键入列名:aes(x=column)
。当然,一旦您修复了列名,这将更容易!;)Dput添加。另外@joran,不幸的是,我无法控制列名(除非我更改它们)。我讨厌它。但除去美元似乎是个问题。谢谢是的,我的观点是,在R中处理数据时,最好自己修改列名,如果必要的话,修改为更可行的名称。否则,你只是在寻求痛苦。相信我,你不会想继续使用那么长又复杂的列名。我觉得自己像个小丑,这就解决了它。非常感谢您的解释。@Nick很高兴我能帮忙!
cars %>%
ggplot(aes(x = speed, y = dist)) +
geom_point()
aes(x = x_in$`Turbine Wind Speed Adjusted m/s (m/s)` ...