渐变填充小提琴图使用ggplot2

时间:2016-12-11 14:20:14

标签: r ggplot2

我想基于箱子中的点密度来渐变填充小提琴图(蓝色表示最高密度,红色表示最低密度)。

我使用以下命令生成了一个绘图,但未能根据密度(在这种情况下是小提琴的宽度)对其进行着色。我还想生成具有相似着色的框图。

library("ggplot2")
data(diamonds)

ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin() 

2 个答案:

答案 0 :(得分:1)

改变你使用fill = variable的小提琴曲线的颜色,如下所示:

ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin(aes(fill=cut)) 

同样适用于boxplot

ggplot(diamonds, aes(x=cut,y=carat)) + geom_boxplot(aes(fill=cut)) 

enter image description here

但是无论你有什么价值都必须为每个剪切都有相同的值,也就是说,如果你想使用例如平均深度/剪切作为颜色变量,你必须编码它。

用dplyr组切割你的钻石并总结得到平均深度(或任何其他变量)

library(dplyr)
diamonds_group <- group_by(diamonds, cut)
diamonds_group <- summarize(diamonds_group, Mean_Price = mean(price))

然后我使用diamond2作为钻石的副本然后操纵数据集

diamonds2 <- diamonds

我合并两个数据帧以将Mean_Depth作为diamond2中的变量

diamonds2 <- merge(diamonds2, diamonds_group)

现在我可以用平均深度绘制它作为颜色变量

ggplot(diamonds2, aes(x=cut,y=carat)) + geom_boxplot(aes(fill=Mean_Price)) + scale_fill_gradient2(midpoint = mean(diamonds2$price))

enter image description here

答案 1 :(得分:0)

刚刚回答了这个 for another thread,但相信它可能更适合这个主题。您可以通过绘制许多段来创建伪填充。您可以直接从 ggplot_built 对象中的底层数据中获取这些数据。

如果您想要一个额外的多边形轮廓(“边框”),您需要根据 x/y 坐标创建它。低于一种选择。

library(tidyverse)

p <- ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin() 

mywidth <- .35 # bit of trial and error

# all you need for the gradient fill 
vl_fill <- data.frame(ggplot_build(p)$data) %>%
  mutate(xnew = x- mywidth*violinwidth, xend = x+ mywidth*violinwidth) 

# the outline is a bit more convoluted, as the order matters
vl_poly <- vl_fill %>%
  select(xnew, xend, y, group) %>%
  pivot_longer(-c(y, group), names_to = "oldx", values_to = "x") %>% 
  arrange(y) %>%
  split(., .$oldx) %>%
  map(., function(x) {
    if(all(x$oldx == "xnew")) x <- arrange(x, desc(y))
    x
    }) %>%
  bind_rows()

ggplot() +
  geom_polygon(data = vl_poly, aes(x, y, group = group), 
               color= "black", size = 1, fill = NA) +  
  geom_segment(data = vl_fill, aes(x = xnew, xend = xend, y = y, yend = y,
                                   color = violinwidth))  

reprex package (v1.0.0) 于 2021 年 4 月 14 日创建