手动更改ggplot中的线型顺序和偏移误差线

时间:2014-01-26 20:14:20

标签: r ggplot2

使用这些数据

Data <- structure(list(value = c(180, 528, 180, 147, 468, 151, 194, 568, 
210), SE = c(21.7869586486209, 21.0831764730322, 21.2726560659361, 
21.7869586486209, 21.0831764730322, 21.2726560659361, 21.7869586486209, 
21.0831764730322, 21.2726560659361), PredictionType = c("InSitu", 
"ExSitu", "ExSitu", "ExSitu", "InSitu", "ExSitu", "ExSitu", "ExSitu", 
"InSitu"), Area = c("AAA", "BBB", "CCC", "AAA", "BBB", "CCC", 
"AAA", "BBB", "CCC")), .Names = c("value", "SE", "PredictionType", 
"Area"), class = "data.frame", row.names = c(NA, -9L))

以下代码我可以生成下面的图。

ggplot(Data)+
  geom_point(aes(x=Area, y=value, color=Area),size=3, shape=1)+
  geom_errorbar(aes(x=Area, ymin=value-SE, ymax=value+SE, color=Area, linetype = PredictionType),cex=0.75)

enter image description here

线型正确区分ExSitu和InSitu预测,但我想要反转线型。同样,我希望虚线为ExSitu,实线为InSitu。

此外,是否可以偏移误差线,使它们不直接相互叠加?理想情况下,我希望固定的InSitu估计集中在该区域(AAA,BBB,CCC)和两个点缀的ExSitu估计中心的左右两侧。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用position参数来抵消(闪避)点和误差线(请参阅例如here)。但是,每个“区域”中有多个点/误差条具有相同的“PredictionType”,并且需要为区域内的每个点创建一个具有唯一值的新变量,以使dodge工作。在这里,我使用ave来创建虚拟变量。我借用了一个未使用的aes主题,fill,用于躲避,然后移除填充图例。使用linetype s的顺序在scale_linetype_manual中更改。

Data$id <- with(Data, ave(Area, Area, FUN = seq_along))
dodge <- position_dodge(width = 0.4)

ggplot(Data, aes(x = Area, y = value, fill = id, colour = Area, linetype = PredictionType)) +
  geom_point(size = 3, shape = 1, position = dodge) +
  geom_errorbar(aes(ymin = value - SE, ymax = value + SE),
                cex = 0.75, position = dodge) +
  scale_linetype_manual(values = c("dotted", "solid")) +
  scale_fill_discrete(guide = FALSE) 

enter image description here

评论后

更新

为了将'InSitu'点置于中间,一种可能性是将'InSitu'数据的id变量设置为2,将'ExSitu'数据分别设置为1和3:

Data <- Data[order(Data$Area, Data$PredictionType), ]
Data$id <- as.character(c(1, 3, 2))

ggplot(Data, aes(x = Area, y = value, fill = id, colour = Area, linetype = PredictionType)) +
  geom_point(size = 3, shape = 1, position = dodge) +
  geom_errorbar(aes(ymin = value - SE, ymax = value + SE),
                size = 1, width = 0.5, position = dodge) +
  scale_linetype_manual(values = c("dotted", "solid")) +
  scale_fill_discrete(guide = FALSE)

enter image description here

答案 1 :(得分:1)

ggplot将PredictionType强制转换为因子,然后按照级别发生的顺序将每个级别的因子分配给线型。默认情况下将ExSitu放在首位,因此您可以通过几种方式解决这个问题。

首先,您可以自己将PredictionType转换为因子,并直接指定您想要的级别:

Data$PredictionType = factor(Data$PredictionType,levels=c('InSitu','ExSitu'))

或者,您可以在将其转换为ggplot时调用它(尽管您可能需要更改图例标题):

ggplot(Data)+
geom_point(aes(x=Area, y=value, color=Area),size=3, shape=1)+
geom_errorbar(aes(x=Area, ymin=value-SE, ymax=value+SE, color=Area, linetype = factor(PredictionType,levels=c('InSitu','ExSitu'))),cex=0.75)