使用这些数据
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)
线型正确区分ExSitu和InSitu预测,但我想要反转线型。同样,我希望虚线为ExSitu,实线为InSitu。
此外,是否可以偏移误差线,使它们不直接相互叠加?理想情况下,我希望固定的InSitu估计集中在该区域(AAA,BBB,CCC)和两个点缀的ExSitu估计中心的左右两侧。
提前致谢。
答案 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)
评论后
更新:
为了将'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)
答案 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)