如何将ggforce::geom_circle中单个圆的填充更改为自定义十六进制代码颜色?

guykilcj  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(122)

对于以下geom_circle()示例:

library(ggplot2)
library(ggforce)
circles <- data.frame(
  x0 = rep(1:3, 3),
  y0 = rep(1:3, each = 3),
  r = seq(0.1, 1, length.out = 9)
)

plt <- ggplot() +
  geom_circle(aes(x0 = x0, y0 = y0, r = r), data = circles)
plt

它正确地生成以下图:

我想根据一个十六进制代码向量来填充各个圆,例如colors <- rep("#00FF00",9)
但是,当尝试使用以下代码操作着色时:

colors <- rep("#00FF00",9)
ggplot() +
   geom_circle(aes(x0 = x0, y0 = y0, r = r), fill = colors, data = circles)

它会产生以下错误:

Error in `geom_circle()`:
! Problem while setting up geom aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error in `check_aesthetics()`:
! Aesthetics must be either length 1 or the same as the data (3249)
✖ Fix the following mappings: `fill`

圆圈的数量显然是9,所以我假设实际的geom_circle()将输入转换为一堆较小的数据点或类似的东西。在任何情况下,如何单独转换颜色?一个潜在的解决方案是迭代地添加每个圆圈,但在我的用例中,需要添加数千个圆圈。

mmvthczy

mmvthczy1#

一个选项是将颜色作为列添加到数据集中,该数据集可以Map到fill aes并添加scale_fill_identity

library(ggplot2)
library(ggforce)

circles$colors <- rep("#00FF00", 9)

ggplot() +
  geom_circle(aes(x0 = x0, y0 = y0, r = r, fill = colors), data = circles) +
  scale_fill_identity() +
  coord_fixed()

e37o9pze

e37o9pze2#

geom_circle()函数确实生成了大量的点来绘制每个圆,这就是为什么当您尝试将填充颜色设置为长度为9的向量时会看到错误。
为每个圆单独着色的一种方法是使用scale_fill_manual()函数手动为每个圆分配颜色。您可以通过向圆数据框添加一列来指定每个圆的颜色,然后将该列Map到geom_circle()中的填充美学来实现此操作。

下面是我的例子:

circles <- data.frame(
  x0 = rep(1:3, 3),
  y0 = rep(1:3, each = 3),
  r = seq(0.1, 1, length.out = 9),
  color = rep(c("#00FF00", "#FF0000", "#0000FF"), each = 3)
)

ggplot(circles) +
  geom_circle(aes(x0 = x0, y0 = y0, r = r, fill = color)) +
  scale_fill_manual(values = unique(circles$color))

在本例中,我在circles数据框中添加了一个名为color的新列,并为每个圆分配了一个唯一的颜色。然后,在geom_circle()中,我将颜色列Map到填充美学。最后,我使用scale_fill_manual()使用颜色列中的唯一值手动为每个圆分配颜色。

相关问题