ggplot2偏移散点图

时间:2011-07-25 16:05:16

标签: r ggplot2 offset

我有两组带误差线的点。我想要偏移第二个,所以它从第一个集合略微向下显示,这样它就不会遮挡原始图像。

这是一个模拟数据集:

x=runif(4,-2,2)
y=c("A","B","C","D")
upper=x+2
lower=x-2
x_1=runif(4,-1,3)
upper_1=x_1+1
lower_1=x_1-2

以下是我用来制作剧情的代码:

qplot(x,y)+
  geom_point(size=6)+
  geom_errorbarh(aes(xmax=upper,xmin=lower),size=1)+
  geom_point(aes(x_1,y),size=6,pch=8,vjust=-1,col="grey40")+
  geom_errorbarh(aes(xmax=upper_1,xmin=lower_1),size=1,col="grey40")

这是情节:

scatterplot

我希望将灰色星号和相关误差条绘制在黑色圆圈和相关误差条下方的头发上。我会转换数据集,但Y轴是分类变量。

4 个答案:

答案 0 :(得分:21)

使用Richie重新组织数据,这也可以完全在ggplot范围内,而不必弄乱轴:

dodge <- position_dodge(width=0.5)  
p <- ggplot(dfr,aes(x=y,y=x,colour=type)) + 
        geom_point(aes(shape=type),position=dodge) +
        geom_errorbar(aes(ymax=upper,ymin=lower),position = dodge) + 
        scale_colour_manual(values = c('gray','black')) +
        scale_shape_manual(values = c(8,19)) +
        coord_flip() + 
        opts(legend.position="none")

给了我这个情节:

enter image description here

注意:由于版本0.9.2 opts已由theme replaced完成:

+ theme(legend.position = "none")

答案 1 :(得分:10)

将您的数据重组为数据框。

x = runif(4,-2,2)
x_1 = runif(4,-1,3)
dfr <- data.frame(
  x = c(x, x_1),
  y = rep(c("A","B","C","D"), 2),
  upper = c(x+2, x_1+1),
  lower = c(x-2, x_1-2),
  type = rep(c("alpha", "beta"), each = 4)
)

添加一个因子y的数字版本的列。

dfr$y_numeric <- with(dfr, 
  as.numeric(y) - ifelse(type == "alpha", 0, 0.1)
)

           x y    upper       lower  type y_numeric
1 0.16694617 A 2.166946 -1.83305383 alpha       1.0
2 1.95060734 B 3.950607 -0.04939266 alpha       2.0
3 1.85516860 C 3.855169 -0.14483140 alpha       3.0
4 0.08773196 D 2.087732 -1.91226804 alpha       4.0
5 0.74837995 A 1.748380 -1.25162005  beta       0.9
6 0.61489655 B 1.614897 -1.38510345  beta       1.9
7 2.31641418 C 3.316414  0.31641418  beta       2.9
8 2.62842027 D 3.628420  0.62842027  beta       3.9

现在您的绘图代码更简单。

ggplot(dfr, aes(x, y_numeric, colour = type)) +
  geom_point(size = 6) +
  geom_errorbarh(aes(xmax = upper,xmin = lower), size = 1) +
  scale_colour_grey()

final image with staggered plots

答案 2 :(得分:2)

在最新的ggplot2中,您可以使用position = position_dodge(width = #)设置所需的躲闪宽度以匹配错误栏尾部的宽度:

set.seed(45)
data <- data.frame(group = c(rep("Z", 4), rep("Y", 4)),
                   value = runif(8),
                   x = rep(c("a","b","c","d"),2))

data$ll <- data$value - abs(runif(8))
data$ul <- data$value + abs(runif(8))


ggplot(data = data, aes(x = x, y = value, color = group)) +
  geom_point(size = 2, position = position_dodge(width = 0.2)) + 
  geom_hline(yintercept = 1, linetype = "dotted") +
  geom_errorbar(aes(ymin = ll, ymax = ul), width = 0.2, position = "dodge")

https://docs.unity3d.com/ScriptReference/Rigidbody.AddExplosionForce.html

答案 3 :(得分:1)

Jared Lander在github上有一个很棒的脚本,可以为水平误差条创建一个新函数position_dodgev。

它在这里: https://github.com/jaredlander/coefplot/blob/master/R/position.r

我通过他的原始帖子找到了它,该帖子的旧版本目前无法安装我的ggplot2: http://www.jaredlander.com/2013/02/vertical-dodging-in-ggplot2/

您可以像使用geom_errorbar一样使用他的函数position_dodge,例如

<ListBox x:Name="SuppliersSearchStatusListBox"
         scrollViewer.CanContentScroll="True"
         AllowDrop="True"
         ItemsSource="{Binding ListStatusOptions}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding arrStatusOption}"
                      IsChecked="{Binding IsChecked}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这个解决方案对我有用,因为我正面对这个情节,并且不想在data.frame中创建一个新列。#/ p>