12

我想使用 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))

在此处输入图像描述

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

在此处输入图像描述

我在 ggplot2 google groups here中找到了一些相关问题的对话。

4

2 回答 2

12

这是另一种可能的解决方案:我采用了@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)

想法:

  1. 我尝试(但失败了)显示一个合理的颜色/alpha 图例。看起来很棘手,但考虑到 ggplot2 的所有图例自定义功能,应该是可能的。

  2. X 轴单元标记需要某种解决方案。许多人不赞成在一个轴上绘制两组单位,而 ggplot2 没有这样的功能。

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

  4. 如果这两种颜色是相加补色,那么无论它们在哪里重叠,您都会看到中性灰色。在重叠不相等的地方,灰色会变成更黄或更蓝。从灰色重叠单元格的略带粉红色的色调来看,我的颜色不是很互补。

在此处输入图像描述

于 2012-11-01T01:41:54.730 回答
6

我认为您想要的内容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')))

在此处输入图像描述

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)

在此处输入图像描述

如果您希望使用它ggsave(感谢下面的@bdemarest 评论和@baptiste)

grid.arrange用类似的arrangeGrob东西代替。

ggsave(plot=arrangeGrob(d_carat, d_depth, ncol=1), filename="plot_2.pdf", height=12, width=8)
于 2012-10-31T22:38:19.863 回答