如何改变ggplot中椭圆的半透明度?

Posted

技术标签:

【中文标题】如何改变ggplot中椭圆的半透明度?【英文标题】:How to change the translucence of ellipses in ggplot? 【发布时间】:2020-10-08 00:22:27 【问题描述】:

我正在 ggplot2 中制作一个包含 100 个不同椭圆的图。我希望绘图上的椭圆/多边形稍微半透明,这样线条最多的区域会变暗,而只有一个椭圆的区域会很暗。

The opacity I want 与 the opacity im currently getting

但是,无论我将alpha 更改为什么,它似乎都没有效果?我做错了什么?

ggplot(data = cssibernobk, aes(iso1, iso2)) +
  scale_fill_manual(name = "Marlin Species", labels = c("Blue Marlin", "Striped Marlin"),values=c(col_list)) +
  geom_polygon(data = ellipse_dfcs,
               show.legend = FALSE,
               mapping = aes(iso1, iso2,
                             group = ellipse_dfcs$group,
                             color = factor(group),
                             fill = factor(group)), fill = NA, alpha = 0.2) + 
  scale_color_manual(values = col_list)+
  geom_point(colour="black", shape=21, size = 2, 
             aes(fill = factor(group))) + 
  ylab(expression(paste(delta^34, "S (\u2030)")))+ 
  xlab(expression(paste(delta^13, "C (\u2030)")))+ 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black")) 

我添加了一些数据:

dput(cssibernobk[1:10,])
structure(list(iso1 = c(-19.0666624548854, -17.8943955612859, 
-18.9928609367509, -16.4710761874456, -18.2727144857982, -20.5069897964015, 
-20.5966996037602, -17.5454265065267, -16.4393689881177, -17.4617536511442
), iso2 = c(19.4934410976126, 19.2364832949763, 19.7701196888491, 
19.837594669008, 19.7147010622141, 20.3802264543413, 20.4655925249838, 
19.0895171633117, 19.7264242586365, 19.2537859386917), group = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1), community = c(1, 1, 1, 1, 1, 1, 1, 
1, 1, 1)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
"data.frame"))

dput(ellipse_dfcs[1:10,])
structure(list(id = c("1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1"), iso1 = c(-15.3019878272902, -15.4740783680741, -15.6530442971316, 
-15.8381649818314, -16.0286950065133, -16.2238671740144, -16.4228955949008, 
-16.6249788519676, -16.8293032272625, -17.0350459786413), iso2 = c(20.3654052739855, 
20.44444500941, 20.5195305006846, 20.5903594050369, 20.6566465194678, 
20.718124929163, 20.7745470822651, 20.8256857866775, 20.8713351248865, 
20.9113112831188), community = c("1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1"), group = c("1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1")), row.names = c(NA, 10L), class = "data.frame")

为帮助干杯!

【问题讨论】:

只有一些绘图设备接受透明多边形。我经常在使用 XQuartz 绘图设备时遇到这个问题。您是否尝试过绘制到.png 我设法在一个非常相似的图中绘制了透明多边形,而没有绘制到 .png,所以我认为这是代码的问题!我会尝试一下,看看它是如何工作的。谢谢! 如果这不起作用,edit 你的问题与dput(cssibernobk[1:10,])dput(ellipse_dfcs[1:10,]) 的一些示例数据,我会看看。 是的,不能让它工作!我添加了一些示例数据,还将添加一个示例,说明我正在尝试实现的目标以及当前的外观。 不幸的是,ellipse_dfcs 的样本中没有足够的数据点来绘制超过一点点。 Here is the output. 也许你可以在 Github 上发布更多(或全部)数据?此外,我们没有col_list,但可能没有必要。这里已经很晚了,但是如果没有其他人可以帮助您,我会在早上看看。 【参考方案1】:

问题是您指定了alpha=,但这会应用于fill=,而不是行的color=。例如,在geom_line() 中,您可以使用alpha= 使线条透明,但geom_polygon() 并非如此。由于使用你的集合很难展示,让我用一个例子来演示:

# I dunno, I'm making shapes...
d <- data.frame(id=c(rep('this',4),rep('that',4)), x=c(0,1,1,0.5,0.5,2,0.5,0.5), y=c(0,0,2,3,0.5,2,2,1))

p <- ggplot(d, aes(x,y)) + theme_bw()
p + geom_polygon(aes(color=id), size=1.5)

真的,没有比这更美丽的画面了。如果我们对此应用alpha=,您会看到只有填充受到影响:

p + geom_polygon(aes(color=id), size=1.5, alpha=0.2)

那么我们该如何解决呢?好吧,您需要另一种方式指定 alpha,即使用alpha(): the function。您可能认为可以在aes() 中使用并直接应用于color= 美学......但你错了。 aes(color=alpha(id, 0.2)) 将不起作用,因为 alpha() 期望发送实际颜色名称,而不是像 ggplot2 这样的因子名称。但是,您可以在 scale_color_manual() 中指定 alpha(),这是我们得出答案的地方:

p + geom_polygon(aes(color=id), size=1.5, alpha=0.2) +
  scale_color_manual(values=alpha(c("this"='blue', "that"='red'),0.2))

可能很难从中看出,但线条的颜色是透明的。您可以在没有 alpha 设置的情况下与相同的颜色进行比较:

p + geom_polygon(aes(color=id), size=1.5, alpha=0.2) +
  scale_color_manual(values=c("this"='blue', "that"='red'))

现在应该很明显了,您需要更改 scale_color_manual() 行。我认为这应该可行:

  scale_color_manual(values = alpha(col_list, 0.2))

【讨论】:

太棒了!那完美!非常感谢您的帮助。

以上是关于如何改变ggplot中椭圆的半透明度?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:如何混合多个不同颜色的半透明多边形?

如何使用 ggplot2 在 R 中制作具有透明背景的图形?

更改ggplot中背景图像的透明度[重复]

Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏

iPhone目标C中错误的半透明视图

如何添加不会破坏且不受AutoLayout影响的半透明背景的子视图?