R ggplot2:如何绘制具有纯色和透明笔划并根据颜色着色的geom_points?

Ser*_*sly 3 r ggplot2

我想制作一个散点图,其中每个点都有一个球体。点及其球体都根据某些列值着色。

一个显示我想要的最小示例:

library(ggplot2)
library(vcd) # only needed for example dataset
ggplot(Arthritis, aes(x = ID, y = Age)) + 
    geom_point(aes(color=Sex), size=10, alpha=.3) + 
    geom_point(aes(color=Treatment), size=3)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这个“解决方案”的问题是使用geom_point两层似乎会弄乱图例。我想只有geom_point一层并使用也添加笔划的形状也会更有意义,所以像这样:

ggplot(Arthritis, aes(x = ID, y = Age)) + 
    geom_point(aes(color=Sex, fill=Treatment), shape=21, size=5, stroke=5)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 这里的图例更有意义,但是,我不知道如何使笔划透明。这很重要,因为当点重叠时,您将看不到任何东西。

这样的答案并不能解决我的问题,因为它们使用恒定颜色,因此可以使用函数alpha. 但是,我无法弄清楚是否以及如何将其与取决于数据的颜色一起使用。

TL;DR:如何绘制geom_points具有纯色和透明笔触但不是恒定颜色的图像?

che*_*123 6

你是在正确的轨道认识到,你可以使用功能上alpha(),并已经意识到,你不能只是把alpha()aes()。但是,您可以在任何函数中alpha()作为values=参数传递scale_*。这是一个使用示例mtcars

ggplot(mtcars, aes(mpg, disp)) + 
  geom_point(
    aes(color=factor(cyl), fill=factor(carb)),
    shape=21, size=4, stroke=4) +
  scale_color_manual(values=alpha(rainbow(3), 0.2))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

一个问题是“factor(carb)图例周围的那些大黑线不适合我。超级ew。您可以使用该guides()功能摆脱它们并使用override.aes=指定您想要在那里显示的内容以及替换它的内容。在在这种情况下,您可以将color=NA覆盖继承的美学设置为透明(仅保留fill=部分)。

ggplot(mtcars, aes(mpg, disp)) + 
  geom_point(
    aes(color=factor(cyl), fill=factor(carb)),
    shape=21, size=4, stroke=4) +
  scale_color_manual(values=alpha(rainbow(3), 0.2)) +
  guides(fill=guide_legend(override.aes = list(color=NA))) +
  labs(color="cyl", fill="carb")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

顺便说一句,没有简单的方法可以将笔触放置在geom_point. 您可能可以为此编写自己的自定义统计/几何体,但geom_point总是先用填充绘制,然后再描边。


All*_*ron 5

解决这个问题的一个简单方法是使较大的透明圆圈根本不是点,而是实心圆圈。这样你就可以用fill美学来标记它们。这使用geom_circle来自ggforce

library(ggplot2)
library(vcd)
library(ggforce)

ggplot(Arthritis) + 
  geom_circle(aes(x0 = ID, y0 = Age, r = 2, fill = Sex), alpha = .3, colour = NA) +
  geom_point(aes(x = ID, y = Age, color = Treatment), size = 3) + 
  coord_equal() + 
  scale_color_discrete(h = c(350, 190))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2020-07-01 创建