如何在ggplot中为独立图层缩放颜色? [英] How to scale colour in ggplot for independent layer?

查看:178
本文介绍了如何在ggplot中为独立图层缩放颜色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

基本上,我从三个不同的建筑物(7个颜色因子)获得每个月的加热('深度')和冷却('桌子')数据。我想在每个月的条形图('cut')中并排绘制三个建筑物(7个颜色因素)。

我希望表示冷却('表')或加热('深度')的条形根据建筑物(颜色因子)改变其阴影,按月份('cut')分组。这是钻石数据可视化的一种不好的方式,但对于建筑物来说,它们应该很好地工作,因为它们的加热和冷却月份通常不会重叠。到目前为止,我有:

  p < -  ggplot(data,
aes(color,value,group = cut ))
p < - p + geom_bar(stat ='identity',
position ='dodge',
aes(fill = variable))
print(p)

我试着玩scale_fill_manual,但想不出一个可行的策略:

$ b ('#0000FF','#0033FF','#0066FF','#FF0000','#FF3300','#FF3300' #FF6600')

p < - p + scale_fill_manual(values = colors,
group = data $ variable)


解决方案

有了一些诡计,这是可能的。派生一个基于钻石的数据集是非常好的,但我想用一个更小的数据集

  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 )和建筑物(<$ c $

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



我们可以选择代表不同颜色的颜色,使其更像您所想。我使用了 RColorBrewer 调色板的蓝调和红色中间。

 颜色<-c(#FC9272,#FB6A4A,#EF3B2C,#9ECAE1, #6BAED6,#4292C6)
#library(RColorBrewer)
#colors <-c(brewer.pal(9,Reds)[4:6],bre​​wer。 pal(9,Blues)[4:6])

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

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


真正的诀窍是让图例变得更加复杂。我只列出了2个关卡(中间建筑的颜色),并给他们不同的名字(和图例中的不同标题)。

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

< img src =https://i.stack.imgur.com/EWtcq.pngalt =在这里输入图片描述>


I have a data set that documents the energy use of three buildings. I have a melted data frame that can be mimicked from the diamonds set:

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

Essentially, I have heating ('depth') and cooling ('table') data for each month('cut') from three different buildings (7 'color' factors). I would like to plot the three buildings (7 'color' factors) side by side in a bar plot for each month ('cut').

I want the bars representing either cooling ('table') or heating ('depth') to vary their shade based on the building ('color' factor) while remaining grouped by month ('cut'). This is a bad way to visualize the diamonds data, but should work well for buildings as their heating and cooling months typically don't overlap. So far I have:

p <- ggplot(data,
        aes(color,value,group=cut))
p <- p + geom_bar(stat = 'identity',
              position = 'dodge',
              aes(fill = variable))
print(p)

I tried playing with scale_fill_manual, but couldn't think of a strategy that works:

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

p <- p + scale_fill_manual(values = colours,
                           group = data$variable)

解决方案

With some trickery, it is possible. Deriving a data set based on diamonds was very good, but I want to work with a smaller data set

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)

You want your fill colour to be based both on the variable (hc) and the building (building), so set it to that interaction.

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

We can pick colors that represent different near shades to make these more like what you want. I used the middle of the "Blues" and "Reds" of the RColorBrewer palettes.

colours <- c("#FC9272", "#FB6A4A", "#EF3B2C", "#9ECAE1", "#6BAED6", "#4292C6")
# library("RColorBrewer")
# colours <- c(brewer.pal(9,"Reds")[4:6], brewer.pal(9,"Blues")[4:6])

and used scale_fill_manual to assign these colours.

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

The real trickery is in making the legend less convoluted. I just list 2 of the levels (the middle building in terms of color) and give them different names (and a different title for the legend).

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

这篇关于如何在ggplot中为独立图层缩放颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆