ggplot2折线图给出“geom_path:每个组只包含一个观察值。你需要调整组审美吗?”
Posted
技术标签:
【中文标题】ggplot2折线图给出“geom_path:每个组只包含一个观察值。你需要调整组审美吗?”【英文标题】:ggplot2 line chart gives "geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?" 【发布时间】:2015-01-20 20:27:53 【问题描述】:使用此数据框(“df”):
year pollution
1 1999 346.82000
2 2002 134.30882
3 2005 130.43038
4 2008 88.27546
我尝试创建这样的折线图:
plot5 <- ggplot(df, aes(year, pollution)) +
geom_point() +
geom_line() +
labs(x = "Year", y = "Particulate matter emissions (tons)", title = "Motor vehicle emissions in Baltimore")
我得到的错误是:
geom_path:每个组仅包含一个观察值。你需要 调整群体审美?
即使我想要折线图,图表也会显示为散点图。我试图用geom_line(aes(group = year))
替换geom_line()
,但这没有用。
在回答中,有人告诉我将年份转换为因子变量。我做到了,问题仍然存在。这是str(df)
和dput(df)
的输出:
'data.frame': 4 obs. of 2 variables:
$ year : num 1 2 3 4
$ pollution: num [1:4(1d)] 346.8 134.3 130.4 88.3
..- attr(*, "dimnames")=List of 1
.. ..$ : chr "1999" "2002" "2005" "2008"
structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82,
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
c("1999", "2002", "2005", "2008")))), .Names = c("year",
"pollution"), row.names = c(NA, -4L), class = "data.frame")
【问题讨论】:
运行它时没有错误。df
可能不是您认为的那样。请以可重复的形式陈述您的问题,即显示dput(df)
的输出。
可能是您的变量是因素,那么您需要将它们转换为数字
@G.Grothendieck 我发布了你所说的。我也转换为数字,但仍然有问题。
您确实应该以可重复的形式陈述问题。如果我们无法重现错误,就很难为您提供帮助。
是否可以按“污染”降序排列线点?
【参考方案1】:
您只需将group = 1
添加到 ggplot 或 geom_line aes() 中。
对于折线图,必须对数据点进行分组,以便知道要连接哪些点。在这种情况下,很简单——所有点都应该连接,所以 group=1。当使用较多的变量并绘制多条线时,通常通过变量来对线进行分组。
参考:Cookbook for R, Chapter: Graphs Bar_and_line_graphs_(ggplot2), Line graphs.
试试这个:
plot5 <- ggplot(df, aes(year, pollution, group = 1)) +
geom_point() +
geom_line() +
labs(x = "Year", y = "Particulate matter emissions (tons)",
title = "Motor vehicle emissions in Baltimore")
【讨论】:
注意,分组必须使用group
参数。仅分组,例如color
是不够的。我只是遇到了这个麻烦,希望这可以帮助遇到同样情况的人
这个答案还有效吗?在美学中添加 group=1 似乎不再起作用了。
@Giacomo -- 适用于我,在 Mac 上的 3.6.2 上。收到可怕的警告,但添加 group=1 解决了问题。 ggplot(lakemeta, mapping=aes(x=Lake, y=Area, group=1)) + geom_line(size=2, color="blue")
能否按“污染”降序排列积分?【参考方案2】:
您收到此错误是因为您的变量之一实际上是因子变量 .执行
str(df)
检查这一点。 然后做这个双变量更改以保留年份数字而不是转换为“1,2,3,4”级别数字:
df$year <- as.numeric(as.character(df$year))
编辑:您的 data.frame 似乎有一个“数组”类变量,这可能会导致 pb。 那就试试吧:
df <- data.frame(apply(df, 2, unclass))
然后再画一遍?
【讨论】:
这对我来说是一个方便的答案,因为它从根本上解决了问题【参考方案3】:我对数据框有类似的问题:
group time weight.loss
1 Control wl1 4.500000
2 Diet wl1 5.333333
3 DietEx wl1 6.200000
4 Control wl2 3.333333
5 Diet wl2 3.916667
6 DietEx wl2 6.100000
7 Control wl3 2.083333
8 Diet wl3 2.250000
9 DietEx wl3 2.200000
我认为x轴的变量应该是数字,这样geom_line才知道如何连接点来画线。
在我将第二列更改为数字后:
group time weight.loss
1 Control 1 4.500000
2 Diet 1 5.333333
3 DietEx 1 6.200000
4 Control 2 3.333333
5 Diet 2 3.916667
6 DietEx 2 6.100000
7 Control 3 2.083333
8 Diet 3 2.250000
9 DietEx 3 2.200000
然后就可以了。
【讨论】:
【参考方案4】:在新会话中启动 R 并将其粘贴到:
library(ggplot2)
df <- structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82,
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
c("1999", "2002", "2005", "2008")))), .Names = c("year",
"pollution"), row.names = c(NA, -4L), class = "data.frame")
df[] <- lapply(df, as.numeric) # make all columns numeric
ggplot(df, aes(year, pollution)) +
geom_point() +
geom_line() +
labs(x = "Year",
y = "Particulate matter emissions (tons)",
title = "Motor vehicle emissions in Baltimore")
【讨论】:
在新会话中启动 R 并将我帖子中的代码粘贴到其中。 你有没有发现这个问题。我和你有同样的问题,每个 x 值我只有一个值。等待您的答复。谢谢。 您能解释一下为什么将所有内容都转换为数字可以解决问题吗?我的有序因子变量是一个字符,所以我不能用数字代替。pollution
是一维数组而不是普通向量。看str(df)
【参考方案5】:
我收到了类似的提示。这是因为我以某个百分比的形式指定了 x 轴(例如:10%A、20%B、....)。 因此,另一种方法可能是将这些值相乘并以最简单的形式编写。
【讨论】:
【参考方案6】:我发现如果绘制的大部分数据超出轴限制,也会发生这种情况。在这种情况下,请相应地调整轴刻度。
【讨论】:
以上是关于ggplot2折线图给出“geom_path:每个组只包含一个观察值。你需要调整组审美吗?”的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:使用geom_line函数可视化折线图并自定义设置折线图的不同区间使用不同颜色
R - ggplot2 Legend没有出现在折线图上[重复]
R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame)添加标题副标题