如何根据某些变量绘制条形图的条件彩色轮廓?

How to plot conditional colored outlines of barplots according to some variable?

我有以下数据

structure(list(date = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 
4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), .Label = c("2011", 
"2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", 
"2020"), class = c("ordered", "factor")), station = c("41B001", 
"41B011_41R012", "41B001", "41B011_41R012", "41B001", "41B011_41R012", 
"41B001", "41B011_41R012", "41B001", "41B011_41R012", "41B001", 
"41B011_41R012", "41B001", "41B011_41R012", "41B001", "41B011_41R012", 
"41B001", "41B011_41R012", "41B001", "41B011_41R012"), concentration = c(NA, 
26.7276362390038, NA, 25.6793849658314, NA, 26.4231406374957, 
NA, 22.318982275586, NA, 22.0774877184965, NA, 21.6359649122807, 
56.1669215086646, 21.6140621430203, 56.1504197761194, 19.7031357486815, 
51.5015359168242, 17.0787333944114, 36.3595993515516, 11.4634841061866
), yield = c(0, 99.9200913242009, 0, 99.9544626593807, 0, 99.9200913242009, 
0, 99.8287671232877, 0, 99.9200913242009, 6.65983606557377, 99.931693989071, 
89.5890410958904, 99.9315068493151, 97.8995433789954, 99.5662100456621, 
96.62100456621, 99.6803652968037, 98.3151183970856, 99.9203096539162
), environ = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("Urbain avec très faible influence du trafic", 
"Urbain avec très forte influence du trafic"), class = "factor"), 
    environ_station = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("Urbain avec très faible influence du trafic (41B011, 41R012)", 
    "Urbain avec très forte influence du trafic (41B001)"), class = "factor")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

用以下代码绘制

ggplot(data, aes(x = date, y = concentration, fill = environ_station)) +
  geom_col(width = 0.75, colour = ifelse(round(data$yield, 0) < 85, "red", "black"), size = 0.5, position = position_dodge2(preserve = "single")) + guides(fill = guide_legend(nrow = 2)) +
  geom_hline(aes(yintercept = 40), linetype = 'dashed', colour = 'red', size = 1) +
  labs(x = '', y = label_conc) +
  theme_minimal() + theme(legend.position="bottom", legend.title = element_blank(), legend.margin=margin(l = -2, unit='line'),
                          legend.text = element_text(size = 10),
                          axis.text.y = element_text(size = 10), axis.title.y = element_text(size = 10), 
                          axis.text.x = element_text(size = 10), axis.title.x = element_blank(),
                          panel.grid.major.x = element_blank()) + geom_hline(yintercept = 0)

如图

但是,到 2016 年的柱状图的最终轮廓以红色绘制,而由于它们的收益率高于 85,因此预计它们将是黑色的。似乎第二个 class 导致了问题(订单混淆)。

请问您知道如何解决这个问题吗?谢谢

问题是您通过颜色参数设置了边框颜色。要解决您的问题,请在 aes() 内有条件地设置颜色,并像我在下面的方法中那样使用 scale_color_manual 或使用 scale_color_identity.

注意:我通过 guides 删除了生成的颜色图例。

library(ggplot2)

ggplot(data, aes(x = date, y = concentration, fill = environ_station)) +
  geom_col(aes(colour = ifelse(round(yield, 0) < 85, "red", "black")), width = 0.75, 
           size = 0.5, position = position_dodge2(preserve = "single")) + 
  scale_color_manual(values = c(red = "red", black = "black")) +
  guides(fill = guide_legend(nrow = 2), color = FALSE) +
  geom_hline(aes(yintercept = 40), linetype = 'dashed', colour = 'red', size = 1) +
  #labs(x = '', y = label_conc) +
  theme_minimal() + theme(legend.position="bottom", legend.title = element_blank(), legend.margin=margin(l = -2, unit='line'),
                          legend.text = element_text(size = 10),
                          axis.text.y = element_text(size = 10), axis.title.y = element_text(size = 10), 
                          axis.text.x = element_text(size = 10), axis.title.x = element_blank(),
                          panel.grid.major.x = element_blank()) + geom_hline(yintercept = 0)
#> Warning: Removed 6 rows containing missing values (geom_col).