【问题标题】:How to use an arbitrary vector for alpha values in ggplot2如何在ggplot2中使用任意向量作为alpha值
【发布时间】:2014-01-30 02:50:07
【问题描述】:

我有一个时间序列轨迹数据集。此外,每个时间序列都带有一个统计权重因子:例如,时间序列 #4 的权重可能为 0.023,而时间序列 #25 的权重可能为 0.321。

我有很多这样的时间序列,我想将它们全部绘制在同一个图上(以相同的颜色),并让它们的不透明度与它们的重量成正比,以便可视化加权分布在空间和时间上。

我已经使用 ggplot2 几乎一路走到了那里,但是花了几天时间努力使用 alpha aes 来正确完成这项工作并且没有运气。我正在尝试为 alpha aes 提供权重向量,但它似乎不起作用。不幸的是,这里没有其他答案使用数据框外部的 alpha 值来源。

这是语法问题,还是我想错了? alpha aes 似乎旨在使用数据框内部的某些内容作为输入,但我无法弄清楚如何将权重集成到数据框而不会使我的数据膨胀到无法管理的大小。

以下代码中的所有内容都有效,除了最后一行:

# parameters for test data
N_timepoints <- 25
N_series <- 1000

# generate N_timepoints*N_series matrix of data
test_data <- matrix(rnorm(N_timepoints*N_series,mean=0,sd=0.1), N_timepoints, N_series)
test_data <- apply(test_data, 2, cumsum)
test_data <- as.data.frame(test_data)

# generate N_series length vector of weights
test_weights <-  rexp(N_series, rate=1) 
test_weights <- test_weights/sum(test_weights)
test_weights <- as.data.frame(test_weights)

# add a column to the data frame to label each timepoint
test_timepoints <- seq(N_timepoints)
test_data_and_timepoints <- cbind(test_timepoints, test_data)
test_data_and_timepoints_long <- melt(test_data_and_timepoints, id="test_timepoints") 

# construct basic plot
p_test <- ggplot(data=test_data_and_timepoints_long, aes(x= test_timepoints, y=value, group=variable))

# tweak background and labels
p_test <- p_test + 
     theme_bw() + 
     theme(legend.position="none") +
     ylab("Coordinate") + 
     xlab("Time Point")

# plot with constant alpha -- not what I want, but close
p_test_alpha <- p_test + geom_line(aes(alpha = 1)) + scale_alpha(range = c(0.01, 0.1))

# plot with alpha proportional to weight -- what I actually want, but doesn't work
p_test_var_alpha <- p_test + geom_line(aes(alpha = test_weights))

【问题讨论】:

    标签: r ggplot2 transparency alpha


    【解决方案1】:

    您的 test_weights 变量必须是与您的 data.frame 大小相同的向量。这是一个解决方案:

    p_test_var_alpha <- 
      p_test + 
      geom_line(aes(alpha = rep(unlist(test_weights), each=25)))
    

    尽管您必须小心确保向量的顺序正确。直接引入data.frame会更好。

    漂亮的图表,顺便说一句(我不是在拍自己的背,我只是把它打印出来,你设计的)。

    【讨论】:

    • 太棒了,非常感谢。你能解释一下rep(unlist(test_weights), each=25) 的作用吗?我是 R 新手,以为我有一个向量,但显然没有?
    • 另外,无论出于何种原因,我的情节(使用你的修复)比你的要饱和得多。将+ scale_alpha(range = c(0.01, 0.1)) 之类的内容添加到情节中会统一使一切变得更加透明,还是以某种方式存在偏见?
    • 最后,我同意索引不匹配是一个愚蠢的错误。有没有直接将权重引入数据的好方法?
    • 比例范围调整应该是不偏不倚的,尽管最终用这种类型的东西证明它对你来说有多好。 unlist 的原因是你的 test_weights 是一个 data.frame,而不是一个向量(而 data.frames 实际上是列表,所以我把数据帧变成了一个向量)。最后,我认为您最好的选择是创建一个 data.frame,其中包含测试 ID 和透明度(此处为 1000 行),并将 merge 它添加到您的数据框中。
    • 此外,根据图像的大小,明显的饱和度可能会有很大差异。如果您在一个小窗口中查看,这可以解释为什么它看起来更饱和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多