如何在ggplot2中更改箱线图颜色并添加点

5

已解决抖动问题,现在我想让点更加明显。我选择了pch=21来得到一个黑色的圆圈并填充颜色。但是,方框也改变成了相同的颜色。如何将方框颜色改回来?我希望图A图B中的方框颜色相同。

library(tidyverse)
library(ggpubr)
mtcars$cyl=factor(mtcars$cyl)

p1=mtcars %>% ggplot(aes(x=cyl, y=mpg, fill=cyl))+  
  geom_boxplot(show.legend = F, aes(fill=cyl))+
  geom_point(position=position_jitterdodge(jitter.width=2, dodge.width = 0), 
             pch=21, aes(fill=factor(wt)), show.legend = F)

p2=mtcars %>% ggplot(aes(x=cyl, y=mpg, fill=cyl))+  
  geom_boxplot(show.legend = F)+
  geom_point(position=position_jitterdodge(jitter.width=0, dodge.width = 0.3), 
             aes(color=factor(wt)), show.legend = F)

ggarrange(p1,p2,labels=c("A","B"))

enter image description here


1
ggplot中的基本设计只允许您映射每个审美标准一次。例如,请参见Hadley在此处的答案多个填充比例尺,具有单独的图例。因此需要各种解决方法。 - Henrik
3个回答

5

您可以使用scale_colour_manual()手动选择颜色。然而,在这个例子中很难实现,因为您已经使用了factor(wt)作为geom_point()的填充美学,它有大约30个级别,所以您必须手动指定每个级别的颜色。为了演示,我已经将填充美学更改为vs

p1=mtcars %>% ggplot(aes(x=cyl, y=mpg))+  
  geom_boxplot(show.legend = F, aes(fill=cyl))+
  geom_point(position=position_jitterdodge(jitter.width=2, dodge.width = 0), 
             pch=21, aes(fill=factor(vs)), show.legend = F) +
  scale_fill_manual(values = c("4" = "red",
                               "6" = "green",
                               "8" = "yellow",
                               "0" = "lightblue",
                               "1" = "black"))
p1

output


2

我发现可以使用ggpubr来实现这个目的。首先,我需要手动定义颜色。然后,使用ggboxplot并添加一个jitter图层,指定fill颜色为预定义的颜色。看起来ggpubr创建了一个独立的图层,不会干扰主图。

col=rainbow(length(levels(factor(mtcars$wt))))[factor(mtcars$wt)]

mtcars %>% ggboxplot(x="cyl", y="mpg", fill="cyl", add="jitter", 
        add.params=list(shape=21, color="black", fill=col, size=3))

enter image description here


2

解决颜色和填充问题的一种快速方法是通过在彩色点下方添加略大的黑色点来修改轮廓点的外观。以下是 p2 的修改版本:

mtcars %>% ggplot(aes(x=cyl, y=mpg, fill=cyl))+  
  geom_boxplot(show.legend = F) +

  # add new geom_point layer BELOW the coloured version, using the same parameters,
  # jittered to the same positions (set the same seed), but with larger size
  geom_point(position=position_jitterdodge(jitter.width=0, dodge.width = 0.3, seed = 1234), 
             aes(group = factor(wt)), show.legend = F, size = 2) +

  geom_point(position=position_jitterdodge(jitter.width=0, dodge.width = 0.3, seed = 1234),
             aes(color=factor(wt)), show.legend = F)

绘图

注意:如果您有许多重叠的点彼此靠近,则此技巧效果不佳,因为黑色“轮廓”将完全位于重叠部分下方。(在这种情况下,选择更清晰的可视化方式可能更合适。)


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