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)

请注意,我们首先只选择 yogunlukdeney1, 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$yogunlukint 的 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$valuemean_se(),按 factor(yourData$yogunluk) 分组。这意味着被用作新的 y 美学。

关于 stat_summary(geom='line'...) 的额外注意事项是我们分配的组审美 = 1。为什么?这是为了 ggplot2 将整个事物视为一个“组”。否则,ggplot2 将只计算 yogunluk 的每个离散值的平均值(这是我们想要的),但不知道它需要连接所有这些点。分配 group=1 只是告诉 ggplot2“所有这些点都应该属于同一组......所以请画一条线连接它们。”。

标签

我觉得很简单。

主题元素

也很简单。有关主题元素的完整列表,只需 check out this reference.