首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2 -2变量聚类列图-变量1的梯度填充和变量2的实心填充

ggplot2 -2变量聚类列图-变量1的梯度填充和变量2的实心填充
EN

Stack Overflow用户
提问于 2018-12-21 00:50:20
回答 2查看 170关注 0票数 0

我有下面的数据,我想要创建一个集群列图表。注意,这是虚拟数据。

代码语言:javascript
复制
dataraw <- read.table(
  text = "CRITERIA,ACTUAL,FUTURE,EFFORT
  Crit1,2,4,2
  Crit2,3,4,3
  Crit3,1,4,5",
  header = T, sep = ","
)

我希望使用实际和未来作为我的两列和标准作为我的x轴。

就上下文而言,实际是衡量当前标准的一种标准。然而,未来是标准应该在哪里的理想状态。努力是衡量从实际到未来需要付出多少努力。

复杂性是,我希望用努力作为渐变填充(理想的定制可用-例如蓝色低,红色高)的实际和我需要的未来是一个坚实的颜色,我选择(在这一点黑色,但它可以调整)。

目前,我能够绘制图表的填充,但我不知道如何包括未来的专栏。

代码语言:javascript
复制
library(ggplot2)

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

这将产生以下结果:

或者,我可以像这样融化数据并绘制输出图,但是工作量成为与实际和未来一样的衡量标准。

代码语言:javascript
复制
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")

其结果是:

但是,我可以从dataframe中删除工作,这将消除我在实际中创建渐变的能力。

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

预先感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-21 01:54:08

完全警告,这开始变得有点烦躁,但我们现在开始:

代码语言:javascript
复制
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最好(如果小于.5 ),而position_nudgewidth值的1/2。

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

票数 1
EN

Stack Overflow用户

发布于 2018-12-21 01:33:12

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

代码语言:javascript
复制
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创建于2018-12-21年(v0.2.0)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53877912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档