如何为独立图层在 ggplot 中缩放颜色?

3

我有一个数据集,记录了三栋建筑物的能源使用情况。我有一个融合过的数据框可以从钻石数据集中模拟:

data <- melt(diamonds[,c('depth','table','cut','color')],id=c('cut','color'))

基本上,我有三座不同建筑物(7个“颜色”因素)每月(“切割”)的供暖(“深度”)和制冷(“表格”)数据。 我想将这三座建筑物(7个“颜色”因素)在每个月(“切割”)中并排放置在一个条形图中。
我希望代表制冷(“表格”)或供暖(“深度”)的条形图根据建筑物(“颜色”因素)而变化其阴影,同时仍按月份(“切割”)分组。 这是一种不好的可视化钻石数据的方式,但对于建筑物来说应该很有效,因为它们的供暖和制冷月份通常不重叠。 到目前为止,我已经:
p <- ggplot(data,
        aes(color,value,group=cut))
p <- p + geom_bar(stat = 'identity',
              position = 'dodge',
              aes(fill = variable))
print(p)

我尝试使用scale_fill_manual来实现,但是无法想出有效的策略:

colours <- c('#0000FF', '#0033FF', '#0066FF', '#FF0000', '#FF3300', '#FF6600')

p <- p + scale_fill_manual(values = colours,
                           group = data$variable)
1个回答

6

通过一些技巧,这是可能的。基于钻石推导数据集非常好,但是我想使用更小的数据集进行工作。

set.seed(1234)
data <-
expand.grid(month = month.abb,
            building = c("Building A", "Building B", "Building C"),
            hc = c("Heating", "Cooling"))
data$value <- rnorm(nrow(data), 60, 10)

您希望填充颜色基于变量(hc)和建筑物(building),因此请将其设置为该交互操作。

ggplot(data, aes(building,value,group=month)) + 
  geom_bar(stat = 'identity',
           position = 'dodge',
           aes(fill = interaction(building, hc)))

我们可以选择代表不同近似色的颜色,使其更符合您的要求。我使用了“RColorBrewer”调色板的“蓝色”和“红色”的中间色。
colours <- c("#FC9272", "#FB6A4A", "#EF3B2C", "#9ECAE1", "#6BAED6", "#4292C6")
# library("RColorBrewer")
# colours <- c(brewer.pal(9,"Reds")[4:6], brewer.pal(9,"Blues")[4:6])

并使用scale_fill_manual来分配这些颜色。

ggplot(data, aes(building,value,group=month)) + 
  geom_bar(stat = 'identity',
           position = 'dodge',
           aes(fill = interaction(building, hc))) +
  scale_fill_manual(values=colours)

enter image description here

真正的技巧在于减少图例的复杂性。我只列出2个级别(颜色上属于中等建筑)并给它们不同的名称(以及图例的不同标题)。

ggplot(data, aes(building,value,group=month)) + 
  geom_bar(stat = 'identity',
           position = 'dodge',
           aes(fill = interaction(building, hc))) +
  scale_fill_manual("Heating/cooling",
                    values=colours,
                    breaks=c("Building B.Heating", "Building B.Cooling"),
                    labels=c("Heating", "Cooling"))

enter image description here


这非常有见地!但是,每个月(或建筑)是否可以是不同的颜色?然后,该渐变将应用于每个建筑物(或月份),以保持一致。这个问题更清晰吗? - Michael Street
谢谢,我会接受这个答案!我只需要添加第三个交互。干杯! - Michael Street

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接