ggplot2-2个变量聚簇柱形图-变量1的渐变填充和变量2的实心填充

时间:2018-12-21 00:50:21

标签: r ggplot2

我有以下数据,我希望根据这些数据创建聚簇柱状图。请注意,这是伪数据。

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是衡量标准当前所处位置的度量。而FUTURE是准则应达到的理想状态。 EFFORT是衡量从ACTUAL到FUTURE需要付出多大努力的度量。

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

目前,我能够用填充图来绘制图表,但是我不确定如何包括“未来”列。

library(ggplot2)

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

这将产生以下输出:

Which results in the following output.

或者,我可以像这样融化数据并绘制输出,但是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")

这将导致以下输出:

Which results in this output.

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

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

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

完全警告,这开始变得有点骇人听闻了,但是我们开始:

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))

enter image description here

唯一的诀窍是width最好小于0.5,而position_nudge则是width值的1/2。

FYI geom_col()等同于geom_bar(stat = 'identity')

答案 1 :(得分:0)

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

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日创建。