[英]ggplot geom_boxplot by grouping rows
这是一种选择,首先重塑数据,然后将其提供给ggplot2
。
library(tidyr)
library(dplyr)
library(ggplot2)
dat=data.frame(yogunluk=c(5,10,15,20),
deney1=c(7,12,14,19),
deney2=c(8,17,18,25),
deney3=c(15,13,19,22),
deney4=c(11,18,17,23),
deney5=c(9,19,16,18),
toplam=c(60,94,102,127),
ortlama=c(10,15.6,17,21.16),
sd=c(2.8,2.8,1.7,2.6),
var=c(8,7,3,6.9))
d=pivot_longer(dat, cols=deney1:deney5)
d=d %>% group_by(yogunluk) %>% summarize(mea=mean(value)) %>% right_join(d)
ggplot(d) +
geom_boxplot(aes(yogunluk, value, group=yogunluk), fill="#3792cb", width=1) +
geom_line(aes(yogunluk, mea)) +
geom_point(aes(yogunluk, mea), size=3, pch=3) +
ggtitle("Boxplot of 5;10;...") +
ylab("Data") +
xlab("") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
我已经尝试尽可能地重新创建您作为示例 plot 显示的内容,这既是因为这样做很有趣,而且因为它可以演示如何组织数据以及如何使用ggplot2
构建 plot 的一些元素。
首先,您的数据不是所谓的整洁数据格式。 (这里是娱乐):
yourData <- data.frame(
yogunluk = c(5,10,15,20),
deney1 = c(7,12,14,19),
deney2 = c(8,17,18,25),
deney3 = c(15,13,19,22),
deney4 = c(11,18,17,23),
deney5 = c(9,19,16,18),
deney6 = c(10,15,18,20),
toplam = c(60,94,102,127)
)
您应该考虑在给定的yoguluk处,您的数据集中的每个deney都有一个值。 如果我们这样想,您将需要将所有这些deney列( deney1, deney2, deney3,...
)及其各自的值“收集”到两个新列中:一个用于识别您正在谈论的“哪个”deney 和一为价值。 我们将使用来自tidyr
的gather()
function 将它们推到一起,但您也可以使用诸如pivot_longer()
类的函数:
library(dplyr)
library(tidyr)
library(ggplot2)
yourData <- yourData %>%
select(yogunluk, deney1,deney2,deney3,deney4,deney5,deney6) %>%
gather(deney, value, -yogunluk)
请注意,我们首先只选择yogunluk
和deney1, deney2,...
的列,而忽略汇总统计列。 原因是因为我们将在实际ggplot2
函数中汇总这些数据。 另一种方法是事先汇总数据,然后 plot 。 这取决于您,但我发现如果您可以在同一个 plot 中同时显示单个数据点及其摘要(如一组数据的平均值),这样做会更好。
现在您的数据格式正确,我将创建 plot。 我假设您实际上切换了 x 轴和 y 轴的含义 - x 轴位于底部,所以从左到右,我们将分配特定yourData$yogunluk
值,而每个deney...
将用于创建沿 y 轴的箱线图。
我将向您展示代码和 plot,然后解释一下每个部分是如何工作的:
ggplot(yourData, aes(x=factor(yogunluk), y=value)) +
geom_boxplot(width=0.5, fill='dodgerblue3', alpha=0.5) +
stat_summary(geom='point', shape=10, size=5) +
stat_summary(geom='line', aes(group=1)) +
labs(y='Data', x='Yogunluk', title='Boxplot of Something') +
theme_classic() +
theme(
plot.background = element_rect(fill='gray90'),
plot.margin = margin(30,30,30,30),
plot.title.position = 'plot',
plot.title = element_text(hjust=0.5, size=16)
)
我故意将 plot 代码分成几部分(通常在我自己的情节中这样做),以便我可以跟踪 plot 本身的各个“部分”。 我将依次解释每个部分。
Plot 区域和几何第一部分是定义 plot 方面、主要美学和几何形状。 这涵盖了基于数据集yourData
添加到 plot 的所有内容。 首先请注意,我指的是factor(yogunluk)
而不仅仅是yogunluk
。 为什么? 因为yourData$yogunluk
是int
的 class - 一个连续变量,在这里我们想要将 plot 作为离散变量。 为了创建一个按yogunluk
分组的箱线图,按定义分组的行为是使我们的 x 轴离散。 所以......我们可以通过要求ggplot2
将此列视为一个factor
来强制它成为这种方式。
geom_boxplot()
代码非常简单。
stat_summary()
命令正在取代使用geom_point()
和geom_line()
。 为什么使用stat_summary
? 因为请注意,我们没有汇总数据。 您可以这样理解: geom_point()
将通过分别绘制数据中的每个点/线/观测值来处理数据集。 如果我们想 plot 一个geom_point()
在sumamrized数据(如mean()
)你会使用stat_summary()
。 这首先计算一个汇总统计(默认为mean_se()
),然后用它来替换 y 美学。 在这种情况下, stat_summary(geom='point')
将计算每组yourData$value
的mean_se()
,按factor(yourData$yogunluk)
分组。 这意味着被用作新的 y 美学。
关于stat_summary(geom='line'...)
的额外说明是我们分配了一个组审美 = 1。为什么? 这是为了让ggplot2
将整个事物视为一个“组”。 否则, ggplot2
将只计算yogunluk
的每个离散值的平均值(这是我们想要的),但不会知道它需要连接所有这些点。 分配group=1
只是告诉ggplot2
“所有这些点都应该属于同一组......所以请画一条连接它们的线。”。
我觉得很简单。
主题元素也很简单。 有关主题元素的完整列表,请查看此参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.