[英]Plot with geom_smooth(,) multiple colours, double y-axis with four variables in ggplot2
我的 ggplot2 繪圖系統與 R 有問題。
我想打印一個圖表,散點圖 + 平滑有兩個等級( ref
)和兩個變量( Vix
, monomer
),其中 vix 指的是左邊的 y 軸,單體指的是右邊的 y 軸。 我想在 130°C 時為ref
使用紅色和藍色深色,在 150°C 時使用相同但較淺的顏色。 顏色如下,但對於理解來說並不重要:'#644196'、'#bba6d9'、'#f92410'、'#fca49c'。 通過這種方式,我將獲得 4 條線和 4 種不同的顏色。
我曾經根據命令定義顏色:scale_color_manual(values=c('#644196', '#bba6d9', '#f92410', '#fca49c')) +
問題是我獲得了 4 行,但只有兩種顏色,而且圖例只有兩個分配(而不是我預期的 4 個)。 看起來它改變了ref
的顏色,並且它沒有為兩個變量Vix
和monomer
分配任何顏色變化。
下面我報告整個代碼。
Dati <- data.frame("Vix" = c(62500, 87000, 122000, 140000, 82700, 73000, 110000, 110000, 140300, 81500), "monomer" = c(0.089,0.08,0.095,0.1,0.111, 0.09, 0.094, 0.099, 0.111, 0.197), "Time" = c(30, 60, 90, 120, 135, 30, 60, 90, 120, 135), "ref" = c('130°C', '130°C', '130°C', '130°C', '130°C', '150°C', '150°C', '150°C', '150°C', '150°C'))
attach(Dati)
library(ggplot2)
library(readxl)
####Graph processing
scaleFactor <- max(Vix) / max(monomer)
Graph <- ggplot(Dati, aes(x= Time, col=(ref))) +
geom_point(aes(y= Vix, col=(ref)), shape = 1, size = 3.5) +
geom_smooth(aes(y= Vix), method="loess") +
geom_point(aes(y= monomer * scaleFactor, col=ref), shape = 1, size = 3.5) +
geom_smooth(aes(y=monomer * scaleFactor), method="loess") +
scale_color_manual(values=c('#644196', '#bba6d9', '#f92410', '#fca49c')) +
scale_y_continuous(name="Vix", sec.axis=sec_axis(~./scaleFactor, name="monomer")) +
theme(
axis.title.y.left=element_text(color='#f92410'),
axis.text.y.left=element_text(color='#f92410'),
axis.title.y.right=element_text(color='#644196'),
axis.text.y.right=element_text(color='#644196')
)
Graph
有人能夠理解我可以做什么來解決這個問題嗎?
預先感謝您的每一個可能的回復。
你有 2 colors 因為你映射到顏色的變量( ref
)有 2 個不同的值。 我想您希望每個ref
值都有Vix
和monomer
曲線。 您可以通過將數據轉換為長格式並創建引用溫度和 Vix 或單體的新變量來實現:
scaleFactor <- max(Dati$Vix) / max(Dati$monomer)
第 1 步:計算monomer
,創建列,告訴您值是 Vix 還是單體(這兩個變量的長格式),然后重新創建ref
Dati <- Dati %>%
mutate(
monomer = monomer * scaleFactor
) %>%
pivot_longer(cols = c(Vix, monomer)) %>%
mutate(ref = str_c(ref, name, sep = "-"))
第 2步 map ref
顏色美學(長格式對於ggplot2
來說很整潔)
ggplot(Dati, aes(Time, value, color = ordered(ref, levels = unique(ref)))) +
geom_point(shape = 1, size = 3.5) +
geom_smooth(method = "loess") +
scale_color_manual("groups", values = c('#fca49c', '#bba6d9', '#f92410', '#644196')) +
scale_y_continuous(name = "Vix", sec.axis = sec_axis(~./scaleFactor, name = "monomer")) +
theme(
axis.title.y.left = element_text(color = '#f92410'),
axis.text.y.left = element_text(color = '#f92410'),
axis.title.y.right = element_text(color = '#644196'),
axis.text.y.right = element_text(color = '#644196')
)
結果:
可能最簡單的方法是在美學規范中向變量添加信息。 在下面的示例中,我們paste0()
系列是Vix
還是monomer
的額外信息粘貼到顏色。
Graph <- ggplot(Dati, aes(x= Time)) +
geom_point(aes(y= Vix, col=paste0("Vix ", ref)), shape = 1, size = 3.5) +
geom_smooth(aes(y= Vix, col = paste0("Vix ", ref)), method="loess") +
geom_point(aes(y= monomer * scaleFactor, col=paste0("Monomer ", ref)), shape = 1, size = 3.5) +
geom_smooth(aes(y=monomer * scaleFactor, col = paste0("Monomer ", ref)), method="loess") +
scale_color_manual(values=c('#644196', '#bba6d9', '#f92410', '#fca49c'),
name = "Series?") +
scale_y_continuous(name="Vix", sec.axis=sec_axis(~./scaleFactor, name="monomer")) +
theme(
axis.title.y.left=element_text(color='#f92410'),
axis.text.y.left=element_text(color='#f92410'),
axis.title.y.right=element_text(color='#644196'),
axis.text.y.right=element_text(color='#644196')
)
Graph
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.