5
df<-data.frame(adjuster=c("Mary","Mary","Bob","Bob"), date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1")), value=c(10,15,25,15))
df
  adjuster       date value
1     Mary 2012-01-01    10
2     Mary 2012-02-01    15
3      Bob 2012-03-01    25
4      Bob 2012-04-01    15

ggplot(df,aes(x=date,y=value,color=adjuster))+geom_line()+geom_point()

在此处输入图像描述

在上图中,请注意 2 月和 3 月点之间的脱节。如何将这些点与蓝线连接起来,使实际的行军点变为红色?换句话说,Bob 应该与来自 [Jan - Mar) 的值和来自 [Mar-Apr] 的 Mary 相关联。

编辑:原来我的例子过于简单。列出的答案并不能概括为两个人不止一次更换调节器的情况。例如,考虑

df<-data.frame(adjuster=c("Mary","Mary","Bob","Bob","Mary"), date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1","2012-5-1")), value=c(10,15,25,15,20))
      adjuster       date value
1     Mary 2012-01-01    10
2     Mary 2012-02-01    15
3      Bob 2012-03-01    25
4      Bob 2012-04-01    15
5     Mary 2012-05-01    20

由于我在原始问题中没有提到这一点,因此我将选择一个仅适用于我的原始数据的答案。

4

4 回答 4

7

更新以尽量减少对 data.frame 的修改,添加了group = 1参数

稍微修改一下你的 data.frame。我猜你应该能够自动化修补。如果你不是,请告诉我。此外,您的ggplot命令没有按照您在问题中发布的图表工作

df<-data.frame(
  adjuster=c("Mary","Mary","Bob","Bob"), 
  date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1")), 
  value=c(10,15,25,15)
)

library(data.table)
library(ggplot2)
dt <- data.table(df)
dt[,adjuster := as.character(adjuster)]
dt[,prevadjuster := c(NA,head(adjuster,-1))]
dt[is.na(prevadjuster),prevadjuster := adjuster]


ggplot(dt) +
geom_line(aes(x=date,y=value, color = prevadjuster, group = 1)) +
geom_line(aes(x=date,y=value, color = adjuster, group = 1)) +
geom_point(aes(x=date,y=value, color = adjuster, group = 1))
于 2013-11-01T17:17:47.383 回答
3

我想提出一种不需要修改数据框的解决方案,它很直观(一旦您考虑了图层的绘制方式),并且不涉及相互覆盖的线条。但是,它确实有一个问题:它不允许您修改线型。我不知道为什么会这样,所以如果有人能插话来启发我们,那就太好了。

对OP的快速回答:

ggplot(df, aes(x = date, y = value, color = adjuster))+
    geom_line(aes(group = 1, colour = adjuster))+
    geom_point(aes(group = adjuster, color = adjuster, shape = adjuster))

在 OP 的数据框中,可以group=1用来创建一个跨越整个时期的组。

用数字说明的例子:

# Create data
df <- structure(list(year = c(1990, 2000, 2010, 2020, 2030, 2040), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Something", class = "factor"), 
    value = c(4, 5, 6, 7, 8, 9), category = structure(c(1L, 1L, 1L, 
    2L, 2L, 2L), .Label = c("Observed", "Projected"), class = "factor")), .Names = c("year", 
"variable", "value", "category"), row.names = c(NA, 6L), class = "data.frame")

# Load library
library(ggplot2)

与 OP 相似的基本图按categoryinsidegeom_point(aes())和 inside对数据进行分组geom_line(aes()),在此应用程序中,该线不会“桥接”两个类别的两个点。

# Basic ggplot with geom_point() and geom_line()
p <- ggplot(data = df, aes(x = year, y = value, group = category)) + 
    geom_point(aes(colour = category, shape = category), size = 4) +
    geom_line(aes(colour = category), size = 1)
ggsave(p, file = "ggplot-points-connect_p1.png", width = 10, height = 10)

在此处输入图像描述

我的解决方案的关键是按内部分组variable但按category内部着色geom_line(aes())

# Modified version to connect the dots "continuously" while preserving color grouping
p <- ggplot(data = df, aes(x = year, y = value)) + 
    geom_point(aes(group = category, colour = category, shape = category), size = 4) +
    geom_line(aes(group = variable, colour = category), size = 1)
ggsave(p, file = "ggplot-points-connect_p2.png", width = 10, height = 10)

在此处输入图像描述

然而,遗憾的是,据我所知,目前无法通过这种方法控制线型:

ggplot(data = df, aes(x = year, y = value)) + 
    geom_point(aes(group = category, colour = category, shape = category), size = 4) +
    geom_line(aes(group = variable, colour = category), linetype = "dotted", size = 1)
## Error: geom_path: If you are using dotted or dashed lines, colour, size and linetype must be constant over the line

备注:我正在使用另一个数据框,因为我正在从我正在做的事情中复制粘贴,这让我访问了这个问题——这样我就可以上传我的图像。

于 2014-12-23T09:35:25.093 回答
2

这是一个简单的解决方案。无需更改原始 data.frame。

ggplot()+
geom_line(aes_string(x='date',y='value'), data=df, lty=2)+
geom_point(aes_string(x='date',y='value', color='adjuster'), data=df)+
geom_line(aes_string(x='date',y='value', color='adjuster'), data=df)

这是我最喜欢的 ggplot 功能之一。你可以很干净地将你的地块一层一层地叠起来。

结果如下: 在此处输入图像描述

于 2013-11-01T17:37:45.803 回答
2

我想出了一个结合了 Codoremifa 和 JAponte 想法的解决方案。

df<-data.frame(adjuster=c("Mary","Mary","Bob","Bob"), date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1")), value=c(10,15,25,15))
df$AdjusterLine<-df$adjuster
df[2:nrow(df),]$AdjusterLine<-df[1:(nrow(df)-1),]$adjuster
ggplot(df)+geom_line(aes(x=date,y=value, color=AdjusterLine), lty=2)+geom_line(aes(x=date,y=value, color=adjuster))+geom_point(aes(x=date,y=value, color=adjuster))

在此处输入图像描述

于 2013-11-01T19:22:18.040 回答