首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2:带面网格的叠加条形图中具有最小值的自动阴影条

ggplot2:带面网格的叠加条形图中具有最小值的自动阴影条
EN

Stack Overflow用户
提问于 2022-08-15 11:33:26
回答 1查看 173关注 0票数 1

我在带有stacked-bar chartsfacet_grid中创建了一些ggplot2,其中使用2 criteria(RMSE, MAE)检查了2 methods(MB, TMB)的性能。

我想要什么

我想添加一个transparent grey阴影到酒吧与一个minimum value为每个堆叠条形图,这样纹理填充将显示以及颜色填充在他们的适当的条形图。

代码语言:javascript
复制
library(ggplot2)
library(reshape2)
set.seed(199)
MB_RMSE_sd1 <-  runif(12, min = 0, max = 2)
TMB_RMSE_sd1 <- runif(12, min = 0, max = 2)
MB_RMSE_sd3 <-  runif(12, min = 2, max = 5)
TMB_RMSE_sd3 <- runif(12, min = 2, max = 5)
MB_RMSE_sd5 <- runif(12, min = 5, max = 10)
TMB_RMSE_sd5 <- runif(12, min = 5, max = 10)
MB_RMSE_sd10 <-  runif(12, min = 7, max = 16)
TMB_RMSE_sd10 <- runif(12, min = 7, max = 16)
MB_MAE_sd1 <-  runif(12, min = 0, max = 2)
TMB_MAE_sd1 <- runif(12, min = 0, max = 2)
MB_MAE_sd3 <-  runif(12, min = 2, max = 5)
TMB_MAE_sd3 <- runif(12, min = 2, max = 5)
MB_MAE_sd5 <-  runif(12, min = 5, max = 10)
TMB_MAE_sd5 <- runif(12, min = 5, max = 10)
MB_MAE_sd10 <-  runif(12, min = 7, max = 16)
TMB_MAE_sd10 <- runif(12, min = 7, max = 16)

ID <- rep(rep(c("N10_AR0.8", "N10_AR0.9", "N10_AR0.95", "N15_AR0.8", "N15_AR0.9", "N15_AR0.95", "N20_AR0.8", "N20_AR0.9", "N20_AR0.95", "N25_AR0.8", "N25_AR0.9", "N25_AR0.95"), 2), 1)
df1 <- data.frame(ID, MB_RMSE_sd1, TMB_MAE_sd1, MB_RMSE_sd3, TMB_MAE_sd3, MB_RMSE_sd5, TMB_MAE_sd5, MB_RMSE_sd10, TMB_MAE_sd10)
reshapp1 <- reshape2::melt(df1, id = "ID")

NEWDAT <- data.frame(value = reshapp1$value, year = reshapp1$ID, n = rep(rep(c("10", "15", "20", "25"), each = 3), 16), Colour = rep(rep(c("RMSE_MB", "RMSE_TMB", "MAE_MB", "MAE_TMB"), each = 12), 4), sd = rep(rep(c(1, 3, 5, 10), each = 48), 1),  phi = rep(rep(c("0.8", "0.9", "0.95"), 16), 4))

NEWDAT$sd <- with(NEWDAT, factor(sd, levels = sd, labels = paste("sd =", sd)))
NEWDAT$year <- factor(NEWDAT$year, levels = NEWDAT$year[1:12])
NEWDAT$n <- with(NEWDAT, factor(n, levels = n, labels = paste("n = ", n)))

library(ggpattern)

ggplot() +
  geom_col_pattern(
    data = NEWDAT[NEWDAT$Colour %in% c("RMSE_MB", "RMSE_TMB"), ],
    aes(x = phi, y = value, pattern = rev(Colour), pattern_angle = rev(Colour)),
    fill            = 'white',
    colour          = 'black', 
    pattern_density = 0.1, 
    pattern_fill    = 'black',
    pattern_colour  = 'black'
  ) +
  geom_col_pattern(
    data = NEWDAT[NEWDAT$Colour %in% c("MAE_MB", "MAE_TMB"), ],
    aes(x = phi, y = -value, pattern = Colour, pattern_angle = Colour),
    fill            = 'white',
    colour          = 'black', 
    pattern_density = 0.1, 
    pattern_fill    = 'black',
    pattern_colour  = 'black'
  ) +
  geom_hline(yintercept = 0, colour = "grey40") +
  facet_grid(sd ~ n, scales = "free") +
  scale_fill_manual(
    breaks = c("MAE_MB", "MAE_TMB", "RMSE_MB", "RMSE_TMB"),
    values = c("red", "blue", "orange", "green")
  ) +
  scale_y_continuous(expand = c(0, 0), label = ~ abs(.)) +
  guides(fill = guide_legend(reverse = TRUE)) +
  labs(fill = "") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = -90, vjust = 0.5))

我还没找到办法。我可以手动将grey-colour fill添加到任何我想要的栏中,但我不能用最小值自动将颜色填充到条形图中。我去过使一个酒吧的边框比另一个更暗,但没有进展。

EN

回答 1

Stack Overflow用户

发布于 2022-08-15 13:44:22

你一直走在正确的道路上!我假设你想要的是所有方面的行为,而不是情节的顶层。

只需添加两个辅助层(geom_col表示填充)并在scale_fill_manual中使用color= "transparent"即可。我把它用橙色写得更清楚,把它改成灰色的。

代码语言:javascript
复制
ggplot() +
  geom_col_pattern(
    data = NEWDAT[NEWDAT$Colour %in% c("RMSE_MB", "RMSE_TMB"), ],
    aes(x = phi, y = value, pattern = rev(Colour), pattern_angle = rev(Colour)),
    fill            = 'white',
    colour          = 'black', 
    pattern_density = 0.1, 
    pattern_fill    = 'black',
    pattern_colour  = 'black'
  ) +
  geom_col(
    data = NEWDAT[NEWDAT$Colour %in% c("RMSE_MB", "RMSE_TMB"), ],
    aes(x = phi, y = value, fill = Colour),
    alpha = 0.5
  ) +  
  geom_col_pattern(
    data = NEWDAT[NEWDAT$Colour %in% c("MAE_MB", "MAE_TMB"), ],
    aes(x = phi, y = -value, pattern = Colour, pattern_angle = Colour),
    fill            = 'white',
    colour          = 'black',
    pattern_density = 0.1,
    pattern_fill    = 'black',
    pattern_colour  = 'black'
  ) +
  geom_col(
    data = NEWDAT[NEWDAT$Colour %in% c("MAE_MB", "MAE_TMB"), ],
    aes(x = phi, y = -value, fill = Colour),
    alpha = 0.5
  ) +   
  geom_hline(yintercept = 0, colour = "grey40") +
  facet_grid(sd ~ n, scales = "free") +
  scale_fill_manual(
    breaks = c("MAE_MB", "MAE_TMB", "RMSE_MB", "RMSE_TMB"),
    values = c("orange", "transparent", "transparent", "orange")
  ) +
  scale_y_continuous(expand = c(0, 0), label = ~ abs(.)) +
  guides(fill = guide_legend(reverse = TRUE)) +
  labs(fill = "") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = -90, vjust = 0.5))

我想另一种选择是已经有一些阴影的定制模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73360434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档