在 ggplot2 中重新排序颜色和图案图例

Reorder color and pattern legends in ggplot2

我使用下面的代码。

右边图例的顺序是citysplit。如何将顺序反转为 splitcity?我尝试在 guides() 中使用顺序,但这不起作用。如何解决?

 library(ggplot2)
 library(ggpattern)
 df <- data.frame(
 no = c(rep("6", 3), "7", rep("8", 6), rep("9", 17), rep("10", 12), rep("11", 21)),
 city = c(rep("Madrid", 47), rep("New York", 13)),
 split = c(rep("blue", 3), rep("blue", 1), rep("blue", 4), rep("red", 2), 
       rep("blue", 2), rep("red", 15), rep("blue", 4), rep("red", 8), 
       rep("blue", 1), rep("red", 7), rep("blue", 2), rep("red", 11)))
 ggplot(data = df, aes(x = no, fill = city, pattern = split)) +
   geom_bar_pattern(
                    color = "black", 
                    pattern_fill = "black",
                    pattern_angle = 45,
                    pattern_density = 0.1,
                    pattern_spacing = 0.01,
                    pattern_key_scale_factor = 0.6) + 
   scale_pattern_manual(values = c(blue = "stripe", red = "none")) + 
   guides(pattern = guide_legend(override.aes = list(fill = "white")),
          fill = guide_legend(override.aes = list(pattern = "none", order=1), # this line is incorrect?
          pattern = guide_legend(order = 0)   # or this line is incorrect?
           ))

我对 guides() 的轻微更改导致 split 在图例中显示在 city 上方。请注意 order 中的差异。没有order = 0.

 library(ggplot2)
 library(ggpattern)

 df <- data.frame(
 no = c(rep("6", 3), "7", rep("8", 6), rep("9", 17), rep("10", 12), rep("11", 21)),
 city = c(rep("Madrid", 47), rep("New York", 13)),
 split = c(rep("blue", 3), rep("blue", 1), rep("blue", 4), rep("red", 2), 
       rep("blue", 2), rep("red", 15), rep("blue", 4), rep("red", 8), 
       rep("blue", 1), rep("red", 7), rep("blue", 2), rep("red", 11)))
 ggplot(data = df, aes(x = no, fill = city, pattern = split)) +
   geom_bar_pattern(
                    color = "black", 
                    pattern_fill = "black",
                    pattern_angle = 45,
                    pattern_density = 0.1,
                    pattern_spacing = 0.01,
                    pattern_key_scale_factor = 0.6) + 
   scale_pattern_manual(values = c(blue = "stripe", red = "none")) + 
   guides(pattern = guide_legend(override.aes = list(fill = "white"), order = 2),
          fill = guide_legend(override.aes = list(pattern = "none", order=1)   
          ))

reprex package (v0.3.0)

于 2021 年 3 月 14 日创建

以防万一您决定要对图中的条重新排序

 df <- data.frame(
 no = c(rep("6", 3), "7", rep("8", 6), rep("9", 17), rep("10", 12), rep("11", 21)),
 city = c(rep("Madrid", 47), rep("New York", 13)),
 split = c(rep("blue", 3), rep("blue", 1), rep("blue", 4), rep("red", 2), 
       rep("blue", 2), rep("red", 15), rep("blue", 4), rep("red", 8), 
       rep("blue", 1), rep("red", 7), rep("blue", 2), rep("red", 11)))
 
df1 <- df %>% 
   group_by(no) %>% 
   mutate(
     count_no_freq = n()
   )
 
 ggplot(data = df1, aes(x = reorder(no, -count_no_freq), fill = city, pattern = split)) +
   geom_bar_pattern(
                    color = "black", 
                    pattern_fill = "black",
                    pattern_angle = 45,
                    pattern_density = 0.1,
                    pattern_spacing = 0.01,
                    pattern_key_scale_factor = 0.6) + 
   scale_pattern_manual(values = c(blue = "stripe", red = "none")) + 
   guides(pattern = guide_legend(override.aes = list(fill = "white"), order = 2),
          fill = guide_legend(override.aes = list(pattern = "none", order=1)   
          ))

reprex package (v0.3.0)

于 2021 年 3 月 14 日创建