ggplot2多个stat_binhex()在一个图像中绘制不同的颜色渐变

met*_*oia 11 r data-visualization hexagonal-tiles ggplot2

我想使用ggplot2的stat_binhex()在同一个图表上同时绘制两个独立的变量,每个变量都有自己的颜色渐变使用scale_colour_gradientn().

如果我们忽略x轴单位不匹配的事实,可重复的例子是在同一图像中绘制下图,同时保持单独的填充梯度.

d <- ggplot(diamonds, aes(x=carat,y=price))+
  stat_binhex(colour="white",na.rm=TRUE)+
  scale_fill_gradientn(colours=c("white","blue"),name = "Frequency",na.value=NA)
try(ggsave(plot=d,filename=<some file>,height=6,width=8))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

d <- ggplot(diamonds, aes(x=depth,y=price))+
  stat_binhex(colour="white",na.rm=TRUE)+
  scale_fill_gradientn(colours=c("yellow","black"),name = "Frequency",na.value=NA)
try(ggsave(plot=d,filename=<some other file>,height=6,width=8))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我发现在谷歌GGPLOT2组相关问题的一些谈话这里.

bde*_*est 11

这是另一种可能的解决方案:我已经采用了@ mnel关于将bin计数映射到alpha透明度的想法,并且我已经转换了x变量,因此它们可以在相同的轴上绘制.

library(ggplot2)

# Transforms range of data to 0, 1. 
rangeTransform = function(x) (x - min(x)) / (max(x) - min(x))

dat = diamonds
dat$norm_carat = rangeTransform(dat$carat)
dat$norm_depth = rangeTransform(dat$depth)

p1 = ggplot(data=dat) +
     theme_bw() +
     stat_binhex(aes(x=norm_carat, y=price, alpha=..count..), fill="#002BFF") +
     stat_binhex(aes(x=norm_depth, y=price, alpha=..count..), fill="#FFD500") +
     guides(fill=FALSE, alpha=FALSE) +
     xlab("Range Transformed Units")

ggsave(plot=p1, filename="plot_1.png", height=5, width=5)
Run Code Online (Sandbox Code Playgroud)

思考:

  1. 我尝试(并且失败)显示一个明智的颜色/阿尔法传奇.看起来很棘手,但考虑到ggplot2的所有图例定制功能,应该是可能的.

  2. X轴单元标签需要某种解决方案.在一个轴上绘制两组单元是很多人不满意的,ggplot2没有这样的功能.

  3. 在这个例子中,对具有重叠颜色的单元格的解释似乎很清楚,但是根据所使用的数据集和所选择的颜色,可能会变得非常混乱.

  4. 如果这两种颜色是附加补充,那么无论它们在哪里均匀重叠,您都会看到中性灰色.在重叠不相等的情况下,灰色将变为更黄或更蓝.从灰色重叠细胞的略带粉红色调来判断,我的颜色并不完全相互补充.

在此输入图像描述


mne*_*nel 5

我认为你想要的东西ggplot2更普遍地违背了图形的原理和语法.在问题得到解决之前(我不会屏住呼吸),你有几个选择

使用facet_wrapalpha

这不会产生一个很好的传奇,但会带你到你想要的东西.

您可以将alpha值设置为按计算Frequency,访问的比例缩放..Frequency..

我不认为你可以很好地合并传说.

library(reshape2)
# in long format
dm <- melt(diamonds, measure.var = c('depth','carat'))

ggplot(dm, aes(y = price, fill = variable, x = value)) + 
   facet_wrap(~variable, ncol = 1, scales  = 'free_x') + 
   stat_binhex(aes(alpha = ..count..), colour = 'grey80') + 
    scale_alpha(name = 'Frequency', range = c(0,1)) + 
    theme_bw() + 
    scale_fill_manual('Variable', values = setNames(c('darkblue','yellow4'), c('depth','carat')))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

gridExtragrid.arrange或一起使用arrangeGrob

您可以创建单独的图并用于gridExtra::grid.arrange排列单个图像.

d_carat <- ggplot(diamonds, aes(x=carat,y=price))+
  stat_binhex(colour="white",na.rm=TRUE)+
  scale_fill_gradientn(colours=c("white","blue"),name = "Frequency",na.value=NA)

d_depth <- ggplot(diamonds, aes(x=depth,y=price))+
  stat_binhex(colour="white",na.rm=TRUE)+
  scale_fill_gradientn(colours=c("yellow","black"),name = "Frequency",na.value=NA)

library(gridExtra)


grid.arrange(d_carat, d_depth, ncol =1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想使用它ggsave(感谢下面的@bdemarest评论和@baptiste)

grid.arrangearrangeGrob类似的东西代替.

ggsave(plot=arrangeGrob(d_carat, d_depth, ncol=1), filename="plot_2.pdf", height=12, width=8)
Run Code Online (Sandbox Code Playgroud)

  • 如果用`arrangeGrob`代替`grid.arrange`,你可以使用`ggsave()`.例如:`ggsave(plot = arrangeGrob(d_carat,d_depth,ncol = 1),filename ="plot_2.pdf",height = 12,width = 8)`.(@baptiste在之前的评论中向我指出了这一点.) (2认同)