R语言 如何抖动/闪避geom_segments,使它们保持平行?

gajydyqb  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(148)

我对我的数据做了类似的事情,但尽管透明,但很难可视化(我的数据的段数比下面的例子少得多),以看到它们的开始和结束。

require(ggplot2)
ggplot(iris, aes(x = Petal.Length, xend = Petal.Width,
                 y = factor(Species), yend = factor(Species),
                 size = Sepal.Length)) +
    geom_segment(alpha = 0.05) + 
    geom_point(aes(shape = Species))

遇到这种解决方案,但是线条是纵横交错的。有没有办法让抖动产生与尖端点平行的线条?我已经尝试过position_dodge而不是position_jitter,但它需要ymaxymax可以集成到geom_segment中使用吗?

ggplot(iris, aes(x = Petal.Length, xend = Petal.Width,
                 y = factor(Species), yend = factor(Species))) +
    geom_segment(position = position_jitter(height = 0.25))+
    geom_point(aes(size = Sepal.Length, shape = Species))
k0pti3hp

k0pti3hp1#

据我所知,geom_segment不允许抖动或匀光。您可以将抖动添加到数据框中的相关变量,然后绘制抖动变量。在您的示例中,因子转换为数值,然后使用scale_y_continuous将因子水平的标签添加到轴上。

library(ggplot2)
iris$JitterSpecies <- ave(as.numeric(iris$Species), iris$Species, 
   FUN = function(x) x + rnorm(length(x), sd = .1))

ggplot(iris, aes(x = Petal.Length, xend = Petal.Width,
                 y = JitterSpecies, yend = JitterSpecies)) +
    geom_segment()+
    geom_point(aes(size=Sepal.Length, shape=Species)) +
    scale_y_continuous("Species", breaks = c(1,2,3), labels = levels(iris$Species))

但似乎geom_linerange允许躲闪。

ggplot(iris, aes(y = Petal.Length, ymin = Petal.Width,
                 x = Species, ymax = Petal.Length, group = row.names(iris))) +
       geom_point(position = position_dodge(.5)) +
     geom_linerange(position = position_dodge(.5)) +
     coord_flip()

cnwbcb6i

cnwbcb6i3#

针对ggplot2版本3.4.2进行了更新,并基于另一个short answer进行构建:
您现在可以使用position = position_dodge2(width = 0.1)。例如:

ggplot(iris, aes(x = Species,
                 ymin = Petal.Length,
                 ymax = Petal.Width)) +
  geom_linerange(position = position_dodge2(width = 0.5)) +
  coord_flip() +
  theme_bw()

将生成此图形:

注意,ggplot2只允许geom_linerange()用于y轴,因此使用coord_flip()

相关问题