簡體   English   中英

手動縮放多個geoms ggplot2的顏色,形狀和線型

[英]Manually scale color, shape, and linetype of multiple geoms ggplot2

這里可以找到我問題的部分解決方案。 我將展示該解決方案的工作原理以及仍然缺乏哪些功能來滿足我的需求。 為了保持一致性,我使用的示例數據集類似於另一個線程中的示例數據集:

library(ggplot2)
library(reshape2)
library(tidyverse)

df <- data.frame(x = c(1:5), a = c(1,2,3,3,3), b = c(1,1.1,1.3,1.5,1.5))
df <- mutate(df, log2 = log2(x))
df <- df <- melt(df, c("x", "log2"))

數據的初始圖(由以下代碼創建)在單獨的圖例中具有shapecolor美感,這是不合需要的:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5)

解決方案建議使用guides()override.aes將這些組合成一個圖例,這肯定是對原始圖的改進:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
  guides(shape = FALSE,
         colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
                                                   linetype = c("blank", "blank", "solid"))))

我的問題是我想在geom_pointgeom_line手動控制color美學。 例如,我想讓三角形變為灰色,圓形為深灰色, log2(x)淺藍色。 我對guides()如何工作的理解非常有限,所以我能做的最好的是:

ggplot(df) +
  geom_point(aes(x, value, shape = variable), color = "gray40", size = 3, data = filter(df, variable == "a")) +
  geom_point(aes(x, value, shape = variable), color = "gray70", size = 3, data = filter(df, variable == "b")) +
  geom_line(aes(x, log2, shape = "log2(x)"), color = "cadetblue2", size = 1.5) +
  guides(shape = guide_legend(override.aes = list(color = c("gray40", "gray70", "cadetblue2"),
                                                  shape = c(16, 17, NA),
                                                  linetype = c("blank", "blank", "solid"))))

這似乎是在geom_line不正確地使用shape美學(假設產生了警告),但這幾乎是我想要的結果。 現在的問題是缺少log2(x)的圖例圖標。 理想情況下,它應顯示與繪圖匹配的水平淺藍色線條。 有誰知道如何實現這個和/或可以更好地解釋如何使用guides()函數?

我還嘗試使用scale_color_manual()scale_linetype_manual()scale_shape_manual()的組合解決方案(所有這些都具有相同的name參數,因此它們應該在單個圖例中結束)。 這種方法的問題在於所有3個幾何圖層都具有color美感,但只有前兩個具有shape美感,只有最后一個具有linetype美學。 因此,即使所有的scale_xx_manual()添加到ggplot設置正確,傳說不合並成一個單一的一個。

我已經堅持了很長時間,所以任何幫助將不勝感激。 謝謝

只需創建一個手動色標,它將改變繪圖和指南中的顏色。 一般而言,您總是希望使用比例來覆蓋指南值,因為它可以消除指南中出錯的風險,這可能會導致您的可視化產生謊言。

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
  scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
  guides(shape = FALSE,
         colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
                                                   linetype = c("blank", "blank", "solid"))))

編輯:

這是一個版本,也避免在形狀上執行指南覆蓋:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable, linetype = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)", linetype = "log2(x)", shape = "log2(x)"), size = 1.5) +
  scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
  scale_shape_manual(values = c("a" = 16, "b" = 17, "log2(x)" = NA)) +
  scale_linetype_manual(values = c("a" = "blank", "b" = "blank", "log2(x)" = "solid"))

ggplot會自動結合傳說當名稱,標簽和方向是相同的( 12 ),所以你只需要確保“A”,“B”,和“的log 2(X)”都映射到每個審美觀相同的訂單。 在這種情況下,我們通過向層添加不必要的映射並忽略警告來實現此目的。

暫無
暫無

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

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