R语言 如何绘制具有重叠x的垂直线段?

hiz5n14c  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(121)
f=read.table(pipe('curl -s https://i.stack.imgur.com/vZwiL.gif | tail -c +43 | zcat'), header=T)
f$x=asinh(f$x)
f$y1=asinh(f$y1)
f$y2=asinh(f$y2)
png('out.png')
with(f, plot(c(x, x), c(y1, y2), type='n'))
with(f, points(x, y1, pch=20))
with(f, segments(x, y1, x, y2))
dev.off()

我想用上面的数据绘制一个线段图。目前的结果是这样的。
这不是很明显。列x是整数,间隔不是相对均匀的。我认为可以做一些事情,如1)将它们分组到bin中,2)以asinh尺度绘制bin,3)在每个bin中应用x中的gitter来解决重叠问题。
通过基于y1对段进行排序,使得y1在每个仓中从低到高(从左到右)排序,可以将3改变为3“。
如何绘制数据,使其比当前解决方案更易于查看(至少如上面两种方法所述,例如gitter vs sort,但也欢迎其他更具创造性的方法),而无需编写太多代码?(欢迎简单的R和ggplot2答案)

mrphzbgm

mrphzbgm1#

对我来说,你想让什么样的数量/比较“更容易看到”并不明显,因为这个短语有点主观和上下文相关。

  • 对比例使用变换,以便数据可以以原始单位显示(如果这对您的情况很重要),并添加一些Alpha以使点密度较高的区域更清晰,并使用不同的颜色来区分上述范围中的点。
library(ggplot2)
asinh_trans <- scales::trans_new(name = "asinh",
                                 transform = base::asinh,
                                 inverse = base::sinh)

ggplot(f, aes(x, y1, xend = x, yend = y2)) +
  geom_segment(alpha = 0.1, color = "blue") +
  geom_point(alpha = 0.5, size = 0.3) +
  scale_x_continuous(trans = asinh_trans) +
  scale_y_continuous(trans = asinh_trans)

  • 使用一个点的样本来给予更多的“指示性”意义上的典型:
ggplot(dplyr::slice_sample(f, n= 200), aes(x, y1, xend = x, yend = y2)) +
  geom_segment(alpha = 0.1, color = "blue") +
  geom_point(alpha = 0.5, size = 0.3) +
  scale_x_continuous(trans = asinh_trans) +
  scale_y_continuous(trans = asinh_trans)

  • 关注x值的分布,在21、22、30等处有一些条带。
ggplot(f, aes(x, y1, xend = x, yend = y2)) +
  # geom_segment(alpha = 0.1, color = "blue") +
  geom_point(alpha = 0.2, size = 0.3) +
  scale_x_continuous(trans = asinh_trans, breaks = 2^c(0:12)) +
  scale_y_continuous(trans = asinh_trans) +
  coord_cartesian(ylim = c(0,5))

EDIT --为每个观测值分配其自身x值的附加方法,因此没有数据重叠,同时在缩放比例上保持x值在1以内。单独查看每个点需要非常宽的图形,但这应该是可能的。

asinh_trans <- scales::trans_new(name = "asinh",
                                 transform = base::asinh,
                                 inverse = base::sinh)
f %>%
  arrange(x, y1) %>%
  group_by(x) %>%
  mutate(x_adj = x + row_number()/n()) %>%

  ggplot(aes(x_adj, y1, xend = x_adj, yend = y2)) +
  geom_segment(alpha = 0.1, color = "blue") +
  geom_point(alpha = 0.5, size = 0.3) +
  scale_x_continuous(trans = asinh_trans, 
                     breaks = c(1*10^(0:5),
                                2*10^(0:5), 
                                5*10^(0:5))) +
  scale_y_continuous(trans = asinh_trans)

相关问题