簡體   English   中英

ggplot 將水平線添加到分組的分類數據並共享圖例

[英]ggplot add horizontal line to grouped categorical data and share legend

這是一些制作分類條形圖並在圖表上放置平均線的代碼。 問題是圖例是分開的,我不知道如何將它們粘在一起。 我想我過去制作了一個虛擬變量並將其包含在 scale_manual arguments 但 geom_vline 不處理“填充”映射。 有任何想法嗎?

library(tidyverse)
data(mtcars)

y = mean(mtcars$mpg)
x = unique(mtcars$cyl)
meanDf <- 
  data.frame(x, y )


mtcars$mean = y
mtcars$group = "mean"

mtcars %>%


ggplot(aes(x = factor(cyl), y = mpg, fill = factor(carb))) +
  geom_col(position = "dodge") +
  geom_hline(data = meanDf, aes(yintercept = y, color = "")) +
  scale_fill_manual(name = "", values = c("blue", "red", "green", "white", "black", "yellow"), labels = paste("myLabel", 1:6)) +
  scale_color_manual(name = "", values = "red", label = "myLabel") +
  theme(panel.background = element_rect(fill = "white")) +
  theme(legend.background = element_rect(color = "black", fill = "white")) 
  
  

我認為為了可讀性,最好將它們分開。 但是,出於格式化目的,您可以通過刪除legend.title (不僅僅是為其分配一個空字符串)並調整legend.marginlegned.spacing來使它們盡可能接近。 例如,

library(tidyverse)
data(mtcars)

y = mean(mtcars$mpg)
x = unique(mtcars$cyl)
meanDf <- 
  data.frame(x, y )


mtcars$mean = y
mtcars$group = "mean"

mtcars %>%
  ggplot(aes(x = factor(cyl), y = mpg, fill = factor(carb))) +
  geom_col(position = "dodge") +
  geom_hline(data = meanDf, aes(yintercept = y, color = "")) +
  scale_fill_manual(name = "", values = c("blue", "red", "green", "white", "black", "yellow"), labels = paste("myLabel", 1:6)) +
  scale_color_manual(name = "", values = "red", label = "myLabel") + 
  theme(
    legend.title = element_blank(), 
    legend.margin = margin(t = 0, b = 0, r = 2, l = 2),
    legend.spacing.y = unit(.5, "pt")
  )

Output 資源

一種選擇是僅使用fill比例並使用自定義鍵字形。

  1. geom_hline的顏色設置為參數,而不是在color aes 上進行映射。 取而代之的是 map fill aes 上的常量,例如"" 缺點是我們會收到警告。
  2. 將額外的顏色和 label 添加到scale_fill_manual
  3. 為了獲得一條線作為geom_hline的鍵字形,我使用了一個自定義鍵字形,它有條件地在draw_key_pathgeom_col的默認鍵字形之間切換fill顏色。 為了完成這項工作,我使用"red2"作為線的附加填充顏色,我在自定義鍵字形 function 內切換為"red"
library(tidyverse)
data(mtcars)

y = mean(mtcars$mpg)
x = unique(mtcars$cyl)
meanDf <- data.frame(x, y )

mtcars$mean = y
mtcars$group = "mean"

draw_key_cust <- function(data, params, size) {
  if (data$fill %in% c("red2")){
    data$colour <- "red"
    data$fill <- NA
    draw_key_path(data, params, size)  
  } else
    GeomCol$draw_key(data, params, size)
}

mtcars %>%
  ggplot(aes(x = factor(cyl), y = mpg, fill = factor(carb))) +
  geom_hline(data = meanDf, aes(yintercept = y, fill = ""), color = "red") +
  geom_col(key_glyph = "cust") +
  scale_fill_manual(name = NULL, values = c("red2", "blue", "red", "green", "white", "black", "yellow"), labels = c("label", paste("myLabel", 1:6))) +
  theme(panel.background = element_rect(fill = "white")) +
  theme(legend.background = element_rect(color = "black", fill = "white"))
#> Warning: Ignoring unknown aesthetics: fill

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM