1

我试图在某些组的一堆点上绘制一条线。例如,我有:

x = rep(c('fruit', 'vegetable'), 15)
z = c(rep(c(rep('fresh', 2), rep('ripe', 2), rep('rotten', 2)), 5)
s = c(rep('pick1', 6), rep('pick2', 6), rep('pick3', 6), rep('pick4', 6), rep('pick5', 6))

y = runif(30, min=11, max=15)
low = rep(c(0, 1), 15)
y[low == 1] = y[low == 1] - 10
y[low == 0] = y[low == 0] - 5

groceries_df = data.frame(type=x, value=y, age=z, species=s)

其中 type 是“fruit”或“vegetable”,age 是“fresh”、“ripe”或“rotten”,species 是商店中不同选择的唯一列表,因此有 2*3 = 6 个值对于每个物种。我将这些值分组在由它们的年龄定义的离散 x 轴上,并且它们按它们的类型分组(因此按它们的类型躲避)。

dodge = position_dodge(width=0.9)
p = ggplot(groceries_df, aes(factor(age), value, color=factor(type), shape=factor(type))) +
           geom_jitter(position=dodge) +
           geom_line(data=groceries_df[groceries_df$type == 'fruit',],     aes(group=factor(species)), position=dodge) +
           geom_line(data=groceries_df[groceries_df$type == 'vegetable',], aes(group=factor(species)), position=dodge)

这段代码产生了一个非常接近我想要的图,但我注意到 geom_line 按物种躲避,而不是按类型。似乎我只需要重定向闪避,即使我需要按物种对实际线进行分组(所以我可以看到一个物种的价值从一种类型到所有年龄段的另一种类型的转变)。有没有办法重定向闪避?

4

1 回答 1

3

一种解决方案是将新列添加到现有数据框中,该数据框将包含typespecies列的组合(实际上需要这两列来对线的点进行分组)(取自@joran answer的想法)。

groceries_df$comb<-paste(groceries_df$type,groceries_df$species)

然后只需将此新列用作group=. 这样你也需要更少的命令行。

ggplot(groceries_df,aes(age,value,color=type,shape=type,group=comb))+
  geom_jitter(position=dodge)+geom_line(position=dodge)

在此处输入图像描述

于 2013-03-06T18:10:52.117 回答