ggplot geom_boxplot 通过分组行
ggplot geom_boxplot by grouping rows
这是我的数据;
我尝试得到的是这样的东西;
y 轴应表示列 'yogunluk',x-axis 应显示每个 'yogunluk' 的每个 'deney' 箱线图。我的意思是,假设一个向量包含我数据 c(7,8,15,11,9,10) 第一行的这些值,应该为这些值绘制一个箱线图。我什至无法想象如何在 geom_boxplot.
中设置那种映射
这是一个选项,首先对数据进行整形,然后将其提供给 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))
我已尝试尽可能地重新创建您显示的示例图,这既是因为这样做很有趣,也因为它可以演示如何组织数据和如何构建图的一些元素ggplot2
.
数据整理
首先,您的数据不是所谓的 Tidy Data 格式。 (这里是娱乐):
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 都有一个 value 97=]。如果我们这样想,您将需要将 deney (deney1, deney2, deney3,...
) 的所有这些列及其各自的值“收集”到两个新列中:一个用于标识“哪个”否认你在谈论一个价值。我们将使用 tidyr
中的 gather()
函数将它们组合在一起,但您也可以使用 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
函数 中总结数据 。另一种方法是预先总结数据,然后绘制它。这有点取决于你,但我发现当你可以在同一个图中显示单个数据点及其摘要(如一组数据的平均值)时,这样做更好。
情节
既然你的数据格式正确,我要创建绘图。我假设你实际上改变了你对 x 和 y 轴的意思 - x 轴在底部,所以从左到右,我们将分配特定的 yourData$yogunluk
值,而每个 [=22] 的值本身=] 将用于创建沿 y 轴的箱线图。
我会向您展示代码和情节,然后解释一下每个部分是如何工作的:
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)
)
剧情代码讨论
我故意将情节代码分成几个部分(通常在我自己的情节中这样做),这样我就可以跟踪情节本身的各个“部分”。我会依次解释每个部分。
绘图区域和几何
第一部分是定义情节方面、主要美学和几何学。这涵盖了基于数据集 yourData
添加到图中的所有内容。首先请注意,我指的是 factor(yogunluk)
而不仅仅是 yogunluk
。为什么?因为 yourData$yogunluk
是 int
的 class - 一个连续变量,在这里我们想要将其绘制为一个离散变量。为了创建按 yogunluk
分组的箱线图,按定义分组的行为使我们的 x 轴离散。所以...我们可以通过要求 ggplot2
将此列视为 factor
.
来强制这样做
geom_boxplot()
代码非常简单。
stat_summary()
命令正在取代使用 geom_point()
和 geom_line()
。为什么要使用 stat_summary
?因为请注意,我们没有汇总数据。您可以这样理解:geom_point()
将通过分别绘制数据中的每个 point/line/observation 来处理数据集。如果我们想在 汇总 数据(如 mean()
)上绘制 geom_point()
,您将使用 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
“所有这些点都应该属于同一组......所以请画一条线连接它们。”。
标签
我觉得很简单。
主题元素
也很简单。有关主题元素的完整列表,只需 check out this reference.
这是我的数据;
我尝试得到的是这样的东西;
y 轴应表示列 'yogunluk',x-axis 应显示每个 'yogunluk' 的每个 'deney' 箱线图。我的意思是,假设一个向量包含我数据 c(7,8,15,11,9,10) 第一行的这些值,应该为这些值绘制一个箱线图。我什至无法想象如何在 geom_boxplot.
中设置那种映射这是一个选项,首先对数据进行整形,然后将其提供给 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))
我已尝试尽可能地重新创建您显示的示例图,这既是因为这样做很有趣,也因为它可以演示如何组织数据和如何构建图的一些元素ggplot2
.
数据整理
首先,您的数据不是所谓的 Tidy Data 格式。 (这里是娱乐):
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 都有一个 value 97=]。如果我们这样想,您将需要将 deney (deney1, deney2, deney3,...
) 的所有这些列及其各自的值“收集”到两个新列中:一个用于标识“哪个”否认你在谈论一个价值。我们将使用 tidyr
中的 gather()
函数将它们组合在一起,但您也可以使用 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
函数 中总结数据 。另一种方法是预先总结数据,然后绘制它。这有点取决于你,但我发现当你可以在同一个图中显示单个数据点及其摘要(如一组数据的平均值)时,这样做更好。
情节
既然你的数据格式正确,我要创建绘图。我假设你实际上改变了你对 x 和 y 轴的意思 - x 轴在底部,所以从左到右,我们将分配特定的 yourData$yogunluk
值,而每个 [=22] 的值本身=] 将用于创建沿 y 轴的箱线图。
我会向您展示代码和情节,然后解释一下每个部分是如何工作的:
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)
)
剧情代码讨论
我故意将情节代码分成几个部分(通常在我自己的情节中这样做),这样我就可以跟踪情节本身的各个“部分”。我会依次解释每个部分。
绘图区域和几何第一部分是定义情节方面、主要美学和几何学。这涵盖了基于数据集 yourData
添加到图中的所有内容。首先请注意,我指的是 factor(yogunluk)
而不仅仅是 yogunluk
。为什么?因为 yourData$yogunluk
是 int
的 class - 一个连续变量,在这里我们想要将其绘制为一个离散变量。为了创建按 yogunluk
分组的箱线图,按定义分组的行为使我们的 x 轴离散。所以...我们可以通过要求 ggplot2
将此列视为 factor
.
geom_boxplot()
代码非常简单。
stat_summary()
命令正在取代使用 geom_point()
和 geom_line()
。为什么要使用 stat_summary
?因为请注意,我们没有汇总数据。您可以这样理解:geom_point()
将通过分别绘制数据中的每个 point/line/observation 来处理数据集。如果我们想在 汇总 数据(如 mean()
)上绘制 geom_point()
,您将使用 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
“所有这些点都应该属于同一组......所以请画一条线连接它们。”。
我觉得很简单。
主题元素也很简单。有关主题元素的完整列表,只需 check out this reference.