ggplot2为什么在点之间画一条垂直线?

时间:2018-07-08 11:42:38

标签: r ggplot2

我已经在广泛的范围内搜索了SO和Internet,但无法找到解决该问题的原因或解决方案。当使用ggplot2绘制时间序列类型数据时,我似乎总是有一条垂直线连接我的点,而不是单点绘制并随时间简单地通过线连接点。这是使用mpg的示例。

require(ggplot2)
gg <- ggplot(mpg, aes(x=year, y=cty, 
group=manufacturer, colour=manufacturer))
gg + geom_point() + geom_line()

是否可以删除连接点的垂直线?为何ggplot2会这样做?感谢您的提前帮助!

根据下面的向下投票和问题进行编辑。

也许mpg并不是用作示例的最佳数据集。我在定义的时间点有多个针对个人的观察结果,我想通过结合geom_point()geom_line()进行绘制。但是,在每个时间点,我个人的观察点(点)也都与一条垂直线相连-我不知道这意味着什么以及如何将其删除。是因为我在同一时间点对同一个人有多个观察结果?

这是一个有助于说明问题的数据集。

dput(x1)
structure(list(Assessment_Time = structure(c(1L, 2L, 1L, 1L, 
2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L, 1L, 3L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 4L, 4L, 
6L, 6L, 2L, 3L, 3L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L), .Label = c("Initial", 
"First follow-up", "Second follow-up", "Third follow-up", "Fourth follow-up", 
"Fifth follow-up"), class = "factor"), id = c(454316L, 454316L, 
1184099L, 1184099L, 1184099L, 1184099L, 1184099L, 1184099L, 1184099L, 
1184099L, 124227L, 124227L, 124227L, 124227L, 124227L, 124227L, 
124227L, 124227L, 124227L, 124227L, 124227L, 124227L, 124227L, 
124227L, 1227808L, 1227808L, 1234280L, 1234280L, 1234280L, 1234280L, 
1233898L, 1233898L, 1233898L, 1233898L, 1233898L, 1233898L, 1233898L, 
1233898L, 1191086L, 1191086L, 1191086L, 1232973L, 1232973L, 1232973L, 
1232973L, 1232973L, 1232973L, 1251251L, 1251251L, 1251251L), 
    US_thickest_um = c(3400, 1500, 7600, 6000, 6600, 4500, 6100, 
    4000, 6400, 3500, 2300, 2400, 3400, 2200, 1500, 2500, 2100, 
    1500, 2500, 1700, 1700, 3800, 2800, 2800, 2300, 1300, 6000, 
    3200, 3800, 1900, 5400, 6200, 2200, 3000, 1900, 2100, 1900, 
    2500, 4600, 2800, 2100, 3400, 1900, 2400, 1700, 2100, 1300, 
    2800, 4000, 3700)), .Names = c("Assessment_Time", "id", "US_thickest_um"
), row.names = c(NA, -50L), class = c("tbl_df", "tbl", "data.frame"
))
gg <- ggplot(x1, aes(x=Assessment_Time, y=US_thickest_um, group=factor(id)))
gg + geom_point(aes(colour=factor(id))) + geom_line(aes(colour=factor(id)))

3 个答案:

答案 0 :(得分:1)

目前尚不清楚您的目标是什么,但可以说它是比较1999年和2008年每个制造商的平均值,并通过绘制各个点来显示变化。

您可以执行类似的操作,不断尝试选项,直到获得所需的方式为止。

means <- mpg %>% dplyr::group_by(year, manufacturer) %>% dplyr::summarize(cty = mean(cty))
ggplot(mpg, aes(x=year, y = cty)) +
    geom_jitter(aes(colour = manufacturer), width = 0.15) +
    geom_line(data = means, aes(group = manufacturer, colour = manufacturer)) 

GGplot of change in cty

答案 1 :(得分:0)

您需要重新考虑绘图设计。

只有两年。因此,这不能成为经典的时间序列折线图。

library(tidyverse)
table(mpg$year)
   year     n
  <int> <int>
1  1999   117
2  2008   117

替代品之一可以是

gg <- ggplot(mpg, aes(x=manufacturer, fill = as.factor(cyl)))
gg + geom_bar(stat = "count") + 
  facet_wrap(~year) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

答案 2 :(得分:0)

目前尚不清楚您要做什么。您指的是时间序列数据,但实际上使用的是完全不同的东西:mpg或更新的样本数据都不是时间序列数据。

假设,您要问的是如何在ggplot中绘制时间序列数据并以不同的彩色线条编码不同的时间序列。这是一个简单的示例,可以帮助您入门。

首先,让我们生成10个时间序列的数据。

ts <- replicate(
    10,
    ts(cumsum(1 + round(rnorm(100), 2)), start = c(1954, 7), frequency = 12),
    simplify = FALSE)

我们将ts个对象转换为data.frame个列表。

lst <- lapply(setNames(ts, paste0("series_", 1:10)), function(x)
    data.frame(Y = as.matrix(x), date = as.Date(as.yearmon(time(gnp)))))

我们现在通过将id映射到colour美学来绘制数据,以将10个不同的时间序列显示为10种颜色不同的折线图。

library(tidyverse)    
dplyr::bind_rows(lst, .id = "id") %>%
    ggplot(aes(date, Y, colour = as.factor(id))) +
    geom_line()

enter image description here