【问题标题】:ggplot2 - 2 variable clustered column chart - gradient fill for variable 1 and solid fill for variable 2ggplot2 - 2 变量聚集柱形图 - 变量 1 的渐变填充和变量 2 的实心填充
【发布时间】:2018-12-21 00:50:20
【问题描述】:

我有以下数据,我想从中创建一个聚集柱形图。请注意,这是虚拟数据。

dataraw <- read.table(
  text = "CRITERIA,ACTUAL,FUTURE,EFFORT
  Crit1,2,4,2
  Crit2,3,4,3
  Crit3,1,4,5",
  header = T, sep = ","
)

我希望使用 ACTUAL 和 FUTURE 作为我的两列,并使用 CRITERIA 作为我的 x 轴。

就上下文而言,ACTUAL 是标准当前所在的度量。而未来是标准应该在哪里的理想状态。 EFFORT 衡量从 ACTUAL 到 FUTURE 需要付出多少努力。

复杂之处在于我希望仅将 EFFORT 用作渐变填充(理想情况下可自定义 - 例如蓝色低,红色高)仅用于 ACTUAL,并且我需要 FUTURE 作为我选择的纯色(此时为黑色,但是可能会调整)。

目前我能够绘制带有填充的图表,但我不确定如何包含 FUTURE 列。

library(ggplot2)

ggplot(dataraw, aes(x = CRITERIA, y = ACTUAL, fill = EFFORT)) + 
  scale_fill_gradient(low = "blue", high = "red") + 
  geom_bar(stat = "identity")

这会导致以下输出:

或者,我可以这样融合数据并绘制输出,但是 EFFORT 成为与 ACTUAL & FUTURE 相同的度量。

library(ggplot2)
library(reshape2)

dataraw.m <- melt(dataraw, id.vars="CRITERIA")

ggplot(data = dataraw.m, aes(CRITERIA, value)) + 
  geom_bar(aes(fill = variable), width = 0.4,
           position = position_dodge(width = 0.5), stat = "identity")

这会导致这个输出:

我可以从数据框中删除 EFFORT,但这会删除我在 ACTUAL 中创建渐变的能力。

我对 R 还是很陌生,所以我不确定我所问的是否可能。

提前感谢您的帮助。

【问题讨论】:

  • 这看起来像您的想法吗? ggplot(dataraw, aes(x = CRITERIA, y = ACTUAL, fill = EFFORT)) + scale_fill_gradient(low = "blue", high = "red") + geom_col(aes(y = FUTURE), fill = "black") + geom_col()
  • @Nate 比我的回答好得多。
  • 谢谢,但不确定 OP 想要什么,他们可能希望像你建造的那样并排,你永远不知道
  • @Nate 非常非常接近谢谢。我需要的唯一调整是让列并排,而不是 ACTUAL 坐在 FUTURE 之上。有什么论据可以让它们并排吗?
  • 抱歉 Nate 和 Tjebo 澄清一下,Crit1 理想情况下将 ACTUAL 和 FUTURE 结合在一起。然后跟随这个 Crit2,然后是 Crit3。 Trejbo 您的解决方案也非常接近,但是 ACTUAL 和 FUTURE 是分开的,而不是 Crit1 并排有 ACTUAL 和 FUTURE - 如果这有意义吗?

标签: r ggplot2


【解决方案1】:

完整的警告开始变得有点 hacky,但我们开始吧:

ggplot(dataraw, aes(x = CRITERIA, y = ACTUAL, fill = EFFORT)) + 
  scale_fill_gradient(low = "blue", high = "red") + 
  geom_col(aes(y = FUTURE), fill = "black", width = .4, position = position_nudge(.2)) +
  geom_col(width = .4, position = position_nudge(-.2))

唯一的技巧是width 最好小于 0.5,而无论width 的值是多少,position_nudge 都是 1/2。

仅供参考geom_col() 等同于geom_bar(stat = 'identity')

【讨论】:

    【解决方案2】:

    快速而肮脏的方法:多次绘制。使您的数据变长(我使用tidyr::gather),以便您可以使用同一y 轴上的值。然后在aes 之外定义future 的颜色。

    library(tidyverse)
    
    dataraw <- structure(list(CRITERIA = c("Crit1", "Crit2", "Crit3"), ACTUAL = c(2L, 3L, 1L), FUTURE = c(4L, 4L, 4L), EFFORT = c(2L, 3L, 5L)), class = "data.frame", row.names = c(NA, 3L))
    
    data_long <- dataraw %>% gather(time, value, ACTUAL, FUTURE)
    
    ggplot() +
      geom_bar(data = filter(data_long, time == 'ACTUAL'),
               mapping = aes(x = time, y = value, group = CRITERIA, fill = EFFORT), 
               stat = 'identity',
               position = position_dodge(width = 1.01))+
    geom_bar(data = filter(data_long, time == 'FUTURE'),
             mapping = aes(x = time, y = value, group = CRITERIA),
             fill = c('black', 'white', 'grey'),
             stat = 'identity',
             position = position_dodge(width = 1.01))
    

    这看起来并不完全“好”,您可能可以使用闪避宽度,当然还有颜色。 也许您可能想考虑以不同的方式进行绘图。也许是实际列后面的“未来”列。

    reprex package (v0.2.0) 于 2018 年 12 月 21 日创建。

    【讨论】:

    • 非常感谢 Tjebo。很接近但不完全。通过查看您的解决方案,我对 R 有了更多了解,因此我非常感激。非常感谢和问候。
    • @JosephJW 没有问题。当您想在图例中添加“未来”时,它可能会变得有点棘手,但这是可能的。有一些关于如何在传说中使用几种美学的线索。如果您想要这样做并遇到问题,请告诉我们。
    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 2019-04-23
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多