我有以下数据,我希望根据这些数据创建聚簇柱状图。请注意,这是伪数据。
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")
这将产生以下输出:
或者,我可以像这样融化数据并绘制输出,但是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还是很陌生,所以我不确定我要问的事情是否可能。
在此先感谢您的帮助。
答案 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))
唯一的诀窍是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日创建。