首页 > 解决方案 > ggplot2 theme to color inside of polar plot

问题描述

I am using ggplot2 to make plots with polar coordinates.

I would like to set the background color inside of the circle to be a different color than the background color outside of the circle. (The reason is that I'm going to convert the plot to a raster and make the area outside the circle transparent.)

The ggplot theme attribute for plot.background does what I expect. But I can't seem to find a way to make panel.background only paint inside the plot. There's no element_circle analog for element_rect.

Can anyone advise?

Here's a minimally reproducible example:

data.frame(
  x = rnorm(1000), 
  spoke = factor(sample(1:6, 1000, replace=T))
) %>% 
  ggplot(aes(x = spoke, fill=spoke, y = x)) +
  geom_violin() +
  coord_polar() +
  theme(
    plot.background = element_rect(fill = "darkblue"),
    panel.background = element_rect(fill = "lightblue",
                                    colour = "lightblue"))

Thanks in advance!

标签: rggplot2

解决方案


这是一个 hacky 方法:在每个因子水平上制作一个包含最小值和最大值的虚拟数据框,然后用它来绘制填充该空间的条形图。使用极坐标设置width = 1将用于制作饼图——在这里它做同样的事情,但你没有区分饼楔。

您可能实际上并不想使用 ; 的确切最大值x。添加一些您认为合适的填充是有意义的,但这应该是一个开始。

如果您正在处理最小值为 0 或高于它的某个数据的数据,则不需要像我一样重复数据——这是我能想到的让条形图从 0 堆叠到最大值的最佳方法,这为正,从 0 到最小值为负。geom_rect最初似乎它更有意义,但我无法让它一直伸展以关闭圆圈。

library(tidyverse)

set.seed(1234)
df <- data.frame(
  x = rnorm(1000), 
  spoke = factor(sample(1:6, 1000, replace=T))
)
bkgnd_df <- data.frame(spoke = factor(rep(1:6, 2)), 
                      x = c(rep(min(df$x), 6), rep(max(df$x), 6)))

bkgnd_df
#>    spoke         x
#> 1      1 -3.396064
#> 2      2 -3.396064
#> 3      3 -3.396064
#> 4      4 -3.396064
#> 5      5 -3.396064
#> 6      6 -3.396064
#> 7      1  3.195901
#> 8      2  3.195901
#> 9      3  3.195901
#> 10     4  3.195901
#> 11     5  3.195901
#> 12     6  3.195901

ggplot(df, aes(x = spoke, y = x)) +
  geom_col(data = bkgnd_df, width = 1, fill = "skyblue") +
  geom_violin(aes(fill = spoke)) +
  coord_polar(theta = "x")

还值得注意的是,它ggforce有一个geom_circle,但我不知道它如何与极坐标一起工作。


推荐阅读