【问题标题】:R plot vary line thickness by frequencyR图根据频率改变线条粗细
【发布时间】:2016-05-09 06:50:30
【问题描述】:

更新:找到了一个粗略的解决方案,它特定于 R 中的 plot() 函数,但它会受益于更好的情节。有任何想法吗?这是另一个级别的绘图,但潜在地,向增加厚度的过渡可能是渐进的。

我在 R 中有一个简单的数据框。

dft <- data.frame(line=c(rep("X1",4),rep("X2",4),rep("X3",4)),+ 
       time=rep(c("t1","t2","t3","t4"),3), value=c(0,1,1,1,0,0.5,1,1,0,0,1,1))

> dft
   line time value
1    X1   t1   0.0
2    X1   t2   1.0
3    X1   t3   1.0
4    X1   t4   1.0
5    X2   t1   0.0
6    X2   t2   0.5
7    X2   t3   1.0
8    X2   t4   1.0
9    X3   t1   0.0
10   X3   t2   0.0
11   X3   t3   1.0
12   X3   t4   1.0

我想这样绘制它,每当线条重叠时,它们相对于线条的数量来说更粗。因此,对于 value 从 1 开始并以 1 结束的那一刻,如果更多的线在同一时间点具有相同的转换,则线会更粗。

同样的数据也可以表示为跃迁频率

transitions <- data.frame(line=character(), generation=character(), t0=numeric(),t1=numeric())
for (line in unique(dft$line)){
  for (number in 1:3)  {
    generation= c("t1","t2","t3","t4")[number]
    generation2= c("t1","t2","t3","t4")[number+1]
    transitions <- rbind(transitions, data.frame(line=line, generation=generation, t0=dft[dft$line == line & dft$time == generation ,]$value, t1=dft[dft$line == line & dft$time == generation2 ,]$value))

  }
}

> transitions
  line generation  t0  t1
1   X1         t1 0.0 1.0
2   X1         t2 1.0 1.0
3   X1         t3 1.0 1.0
4   X2         t1 0.0 0.5
5   X2         t2 0.5 1.0
6   X2         t3 1.0 1.0
7   X3         t1 0.0 0.0
8   X3         t2 0.0 1.0
9   X3         t3 1.0 1.0

这听起来像是一个常见的问题。我确实找到了一些关于如何改变厚度的答案,但并不是真正基于频率。谁能指出我正确的方向?谢谢!

更新:最终,每条线 (X1,X2,X3) 都应在经过时间 t1:t4 时进行跟踪,x 轴为时间,y 轴为值。如下图(使用下面的初步解决方案生成)。也许 R 中有一些工具可以制作更好的图形。

【问题讨论】:

  • 你能展示一下情节应该是什么样子吗?像这样的东西? plot(as.numeric(dft$time), dft$value, type="l").
  • 谢谢,差不多!我的意思是 X1、X2 和 X3 为线,生成为 x 轴,为线绘制值,收敛过渡更粗(更新 Q)。刚刚想出了一个粗略的解决方案并将其发布在下面。但如果您知道如何改进输出,我将不胜感激。

标签: r ggplot2 plot


【解决方案1】:

这是一个通过改变线条透明度的快速绘图。

dft$x <- dft$time
levels(dft$x) <- 0:3
dft$x <- as.numeric(dft$x)
ggplot(dft, aes(x, value, group=line)) + geom_line(size=1, alpha=0.15)

【讨论】:

  • 谢谢!有什么方法可以结合厚度和透明度吗?真实数据的问题是频率在 1 到 20 之间变化,而厚度可能是显示这一点的有用方法。该解决方案非常有用!
  • 也许可以以某种方式抖动线条,使它们不会完全重叠,从而使线条之间的差异更加明显?
【解决方案2】:

我想出了一个使用常规情节的粗略解决方案。如果有人有一个更好的情节的解决方案,例如有了ggplot,我会很高兴学习。也许 ggplot 中不同程度的透明度可以解决问题。

df<-ddply(transitions,.(generation,t0,t1),nrow)
levels(df$generation) <- c(0,1,2,3)
df$generationnr <- as.numeric(as.character(df$generation))

plot(1:1, 1:1, lwd = 1, type = 'l', xlim = c(0,3), ylim = c(0,1))
for (item in 1:nrow(df))
  lines(c(df$generationnr[item],(df$generationnr[item]+1)),+
              c(df$t0[item],df$t1[item]),lwd=df$V1[item] )

有了更真实的数据,这个粗略的解决方案会变得有点不稳定,难以理解线宽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2014-05-11
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多