繁体   English   中英

ggplot geom_boxplot 通过对行进行分组

[英]ggplot geom_boxplot by grouping rows

这是我的数据;

在此处输入图像描述

我试图得到的是这样的东西;

在此处输入图像描述

y 轴应代表“yogunluk”列,x 轴应显示每个“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))

在此处输入图像描述

我已经尝试尽可能地重新创建您作为示例 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 和一为价值。 我们将使用来自tidyrgather() function 将它们推到一起,但您也可以使用诸如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函数中汇总这些数据。 另一种方法是事先汇总数据,然后 plot 。 这取决于您,但我发现如果您可以在同一个 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 区域和几何

第一部分是定义 plot 方面、主要美学和几何形状。 这涵盖了基于数据集yourData添加到 plot 的所有内容。 首先请注意,我指的是factor(yogunluk)而不仅仅是yogunluk 为什么? 因为yourData$yogunlukint的 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$valuemean_se() ,按factor(yourData$yogunluk)分组。 这意味着被用作新的 y 美学。

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

标签

我觉得很简单。

主题元素

也很简单。 有关主题元素的完整列表,请查看此参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM