R / ggplot2:如何根据 Dataframe 中另一列中的值设置方面面板标签背景色条件

pgvzfuti  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(116)

下面是我在ggplot 2中使用面包裹为美国各州绘制回归线的代码:

ggplot(data = allYearsSlope, aes(x = year, y = residual)) +
  geom_smooth(method = "lm", se = FALSE) +
  facet_wrap(~ state, ncol = 8) +
  theme(
          strip.text = element_text(size = rel(0.5), face = "bold"),
          panel.background = element_rect(fill = "white"),
          panel.border = element_rect(color="purple",fill=NA),
          plot.background = element_blank(),
          axis.ticks.x = element_blank()
        )  +
  scale_x_continuous(labels = NULL)

它运行良好,但现在我尝试根据存储在包含其余数据的 Dataframe 中的值(“blue”或“绿色”)为facet面板标签(在本例中,包含每个面板上方显示的状态名称的框)着色。颜色存储在allYearsSlope$panelColor中。很难弄清楚如何执行此操作。
我在这里读过解决方案:Conditional formatting of panel background in GGplot2。沿着它所指的其他一些SO答案。但我真的看不到从这些答案中得出的方法。有人有什么想法吗?
非常感谢你的帮助。

kcrjzv8t

kcrjzv8t1#

据我所知,最简单的方法是使用ggh4x包:

library(ggh4x)
#> Loading required package: ggplot2

ggplot(iris, aes(Sepal.Width, Petal.Length)) +
  geom_point() +
  geom_smooth(formula = y ~ x, method = "lm") +
  facet_grid2(.~Species, scales = 'free',
               strip = strip_themed(
                 background_x = list(element_rect(fill = "red"),
                                     element_rect(fill = "green"),
                                     element_rect(fill = "yellow"))))

创建于2022年12月24日,使用reprex v2.0.2

    • 编辑**

不可能将条带颜色Map为一种美学效果,所以这需要通过编写自己的自动化来完成。我们可以创建一个element_rect列表,而不是手动传递一个element_rect列表,其填充颜色取决于每个分面子集的回归属性。这并不像听起来那么棘手。例如,我们根据板中回归线的斜率将条带着色-〈0.5为红色,〉0.5为绿色:

library(ggh4x)

ggplot(iris, aes(Sepal.Width, Petal.Length)) +
  geom_point() +
  geom_smooth(formula = y ~ x, method = "lm") +
  facet_grid2(.~Species, scales = 'free',
              strip = strip_themed(
                background_x = lapply(split(iris, iris$Species), function(x) {
                  element_rect(fill = ifelse(
                    coef(lm(Petal.Length ~ Sepal.Width, data = x))[2] < 0.5,
                    "red", 
                    "green"))
                })
                ))

相关问题