![](/img/trans.png)
[英]Add a number of observations per group AND SUBGROUP in ggplot2 boxplot
[英]ggplot2: draw lines connecting observations in each group in faceted boxplot
我有以下數據框:
set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = as.factor(rep(c("X", "Y", "Z"), times = 30)), X1 = runif(180), Complexity = rep(c("High", "Low"), times = 90), nsim = rep(rep(1:10, times = 9), each = 2))
我想為每種方法、三種模式以及每種復雜性獲得 X1 的箱線圖。 我使用以下情節:
ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
facet_grid(~Complexity) +
geom_boxplot() +
theme(legend.position = 'bottom',
axis.text.x = element_text(angle = 45, hjust = 1)) +
guides(fill = guide_legend(nrow=1))
這給了我附圖:
極好。 但是,方法 A、B 和 C 的每個觀察結果都位於“X”內的同一數據集(帶有指標 nsim)上(“Y”內的情況相同,“Z”內的情況相同),我想將這些觀察結果聯系起來(X1 的值)在三種模式中的每一種中的三種方法之間(但不要鏈接這三種模式,因為那將毫無意義)。
具體來說,我想要一個如下圖(用手繪線想象連接不同的模擬 IDS 在這里):
因此,我嘗試了以下操作,但是,我讓每個 x 的箱線圖不再聚集在一起(並且 x 軸現在也搞砸了)。
library(ggplot2)
ggplot(dd, aes(x = interaction(Method,Pattern), y = X1, fill = Method)) +
geom_boxplot(aes(fill = Method), position = "identity") +
geom_line(aes(x = interaction(Method,Pattern), y = X1,
group=interaction(Pattern,nsim)),
size = 0.15, alpha = 0.5, colour = I("#525252")) +
facet_grid(~Complexity) +
theme_light() +
theme(legend.position = 'bottom') +
guides(fill = guide_legend(nrow=1)) +
geom_line(aes(x = interaction(Method,Pattern),
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
geom_point(aes(x = interaction(Method,Pattern),
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
scale_x_discrete(labels = c("","X", "", "", "Y", "", "", "Z","")) + xlab("Pattern")
這給出了以下內容:
但是 Pattern 的每個設置的箱線圖被分開(我希望它們聚集在一起)並且 x 軸也被弄亂了(我有一些不雅的修復)。 所以,我需要解決的最重要的事情仍然是每個模式內箱線圖之間的空間(我希望它更小),而不是不同模式的箱線圖之間的空間。
我該如何解決? 非常感謝您的建議。
這是你要找的嗎?
ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
geom_line(aes(group=interaction(Method,nsim)),
position = position_dodge(width = 0.8),
size = 0.1, alpha = 0.5, colour = I("#525252")) +
facet_grid(~Complexity) +
geom_boxplot() +
theme(legend.position = 'bottom',
axis.text.x = element_text(angle = 45, hjust = 1)) +
guides(fill = guide_legend(nrow=1)) +
theme_light()
我不確定是否有更好的方法來執行此操作,但我執行了以下操作:
set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = rep(c("X", "Y", "Z"), times = 30), X1 = runif(180), Complexity = rep(c("High", "Low"), times = 90), nsim = rep(rep(1:10, times = 9), each = 2))
library(ggplot2)
# create dummy dataframe.
dummy.df <- dd
dummy.df[nrow(dd) + 1:2,"Pattern"] <- unique(dd$Pattern)[-3]
dummy.df[nrow(dd) + 1:2,"Method"] <- "ZZZ"
dummy.df[nrow(dd) + 1:2,"Complexity"] <- c("High","Low")
dummy.df$dummy <- interaction(dummy.df$Method,dummy.df$Pattern)
ggplot(dummy.df, aes(x = dummy, y = X1, fill = Method)) +
geom_boxplot(aes(fill = Method)) +
geom_line(aes(x = dummy, y = X1,
group=interaction(Pattern,nsim)),
size = 0.15, alpha = 0.5, colour = I("#525252")) +
facet_grid(~Complexity) +
theme_light() +
theme(legend.position = 'bottom') +
guides(fill = guide_legend(nrow=1)) +
geom_line(aes(x = dummy,
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
geom_point(aes(x = dummy,
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
scale_x_discrete(labels = c("","X", "", "", "", "Y", "", "", "", "Z","","")) +
xlab("Pattern") +
scale_fill_brewer(breaks=c("A", "B", "C"), type="qual", palette="Dark2")
產生以下結果:
我希望箱線圖彼此更接近,如果有人有任何想法,我希望就如何做到這一點提供一些建議。 也許下一步將把它寫成一個通用函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.