【问题标题】:ggplot2 grey-scale-schemes: suggestions for clarifying changepoint plotggplot2 gray-scale-schemes:澄清变点图的建议
【发布时间】:2015-11-13 16:24:32
【问题描述】:

我可以使用 ggplot2 绘制多个同时经历变化点和状态的时间序列,并且我可以使用颜色来使状态清晰(使用 geom_rect 以不同的颜色绘制不同的部分)。我需要制作一个情节,在不使用颜色的情况下清楚地说明政权在哪里。使用三种制度,可以区分使用白色、黑色和灰色作为阴影的制度,但如果存在三种以上的制度,则很难区分它们。

我已经举了一个我可以使用颜色制作的情节示例,如果有人可以建议一个不使用颜色传达相同信息的情节,我将不胜感激。

library(ggplot2)
library(scales)
# generate 3 time series and store them in a data frame
generate_cp_ts <- function(tau, params) {
    ts(c(arima.sim(model = list(ar = 0.2), n = tau[1], rand.gen = function(n) params[1] * rnorm(n)), arima.sim(model = list(ar = 0.2), n = tau[2] - tau[1], rand.gen = function(n) params[2] * rnorm(n)), arima.sim(model = list(ar = 0.2), n = tau[3] - tau[2], rand.gen = function(n) params[3] * rnorm(n)), arima.sim(model = list(ar = 0.2), n = tau[4] - tau[3], rand.gen = function(n) params[4] * rnorm(n))))
}
tau <- 100 * (1:4)
ts1 <- generate_cp_ts(tau, c(1.7, 0.3, 1.7, 1.7))
ts2 <- generate_cp_ts(tau, c(0.3, 2, 0.3, 0.9))
ts3 <- generate_cp_ts(tau, c(2, 2, 0.1, 0.7))
tsframe <- data.frame(ts = c(ts1, ts2, ts3), ts_level = factor(paste("Time Series", rep(1:3, each = 400))), time = rep(1:400, 3))
# Work out which colors are needed to color the plot and store in a data frame
CPs <- c(0, tau)
colour.frame <- data.frame(regime.from = rep(CPs[-length(CPs)], each = 3), regime.to = rep(CPs[-1], each = 3), ts_level = factor(paste("Time Series", rep(c(1:3), length(CPs) - 1))), regime = factor(c(0,0,0, 1,1,0, 0,0,1, 0,2,2) + 1))
# Plotting
qplot(x = time, y = ts, data = tsframe, facets = ts_level ~ ., alpha = I(1), geom = "line", ylab = "Time Series", xlab = "Time") +
    geom_rect(aes(NULL, NULL, xmin = regime.from, xmax = regime.to, fill = regime), ymin = -6, ymax = 6, data = colour.frame) +
    scale_fill_manual(values = alpha(c("blue", "red", "green"), 0.2))

Plot generated by the above code

【问题讨论】:

  • 尝试使用c("white", "grey", "black") 代替现有颜色。
  • 就像我在问题中所说的那样,白色、灰色和黑色适用于这个情节中的颜色,但是当我用更多颜色绘制情节时,我真的不清楚我是否使用不同的灰色阴影
  • 我认为,特别是如果您必须留在黑白并且有许多不同的区域,则无法绕过某些文本。例如,您可以在变化点处绘制垂直线,并在中间绘制一条说明该政权的文本。
  • @David 这似乎是个好主意,在 ggplot2 中编写代码容易吗?
  • @jeremycg 您是否建议我使用不同的线型来显示不同的制度?我可以用线条来显示变化,但它没有给出制度的指示。我想我可以将这些线条与制度标签结合使用(使用geom_vlinegeom_text

标签: r plot ggplot2 metadata color-scheme


【解决方案1】:

创建colour.frame 后,您可以插入以下代码:

tdf <- colour.frame

tdf$xval <- (tdf$regime.from + tdf$regime.to)/2
tdf$yval <- max(tsframe$ts) * 0.8 # if 0.8 is higher (0.9) then the text is set higher 

ggplot(tsframe, aes(x = time, y = ts)) + 
  geom_line() + 
  facet_grid(ts_level~.) + 
  geom_vline(xintercept = CPs) + # maybe play around with linetype
  geom_text(aes(x = xval, y = yval, label = regime), data = tdf)

这给出了这个情节:

【讨论】:

  • 我认为这是解决问题的好方法。我将尝试放置我正在应用此方法的真实数据的数字(某些段非常短,可能会影响放置)。感谢您的帮助。
  • 总是很高兴,与此同时,感谢您提供arima.sim 的语法,我想研究它们,但还没有找到时间/机会。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多