数据可视化——R语言ggplot2包绘制精美的小提琴图(并箱线图或误差条图组合)

数据可视化——R语言ggplot2包绘制精美的小提琴图(并箱线图或误差条图组合)

概述:R语言使用ggplot2工具包绘制小提琴图。为了使数据表达更加丰富,同时将小提琴图与箱线图和误差条图相结合。另外,当每个组别有两个属性变量时,分半的小提琴图可节省绘图空间,同时更美观。为了突出小提琴图表达数据的优越性,常规的条形图结合误差条图也被绘制。

小提琴图(Violin Plot)用于显示数据分布及其概率密度,因其形状酷似小提琴而得名。
在这里插入图片描述

图1 小提琴图示例

这种图表结合了箱线图和密度图的特征,主要用来显示数据的分布形状。中间的黑色粗条表示四分位数范围,从其延伸的幼细黑线代表95% 置信区间,而白点则为中位数。如果需要,中间的箱线图还可以替换为误差条图。

箱线图或误差条图在数据显示方面受到限制,简单的设计往往隐藏了有关数据分布的重要细节。例如使用箱线图时,我们不能了解数据分布是双模还是多模。小提琴图能够展示数据的真正分布范围和形状。值得注意的是,虽然小提琴图可以显示更多详情,但它们也可能包含较多干扰信息。

使用工具:R语言中的ggplot2工具包

本文的结构与之前一致,主要展示一些我在实践过程中的示例。以下示例依据内容分别介绍,完整的代码详见文章末尾。 数据采用模拟生成的数据。以下示例中的数据包括两个组别(group1和group2),每个组别共两个属性(Attribute_1和Attribute_1),每个组别的每个属性各100个测量值。

模拟数据的生成代码如下:

rm(list=ls()) #清除工作区
library(ggplot2)

#生成模拟数据
Group <- rep(c("group1","group2"),each=200) #组别变量
Group <- factor(Group) #组别因子化
Attribute <- c(rep("Attribute_1",100),rep("Attribute_2",100),rep("Attribute_1",100),rep("Attribute_2",100)) #每个组别的两个属性
Attribute <- factor(Attribute) #属性因子化
value <- c(rnorm(100)+1,rnorm(100)+2,rnorm(100)+1.2,rnorm(100)+1.5) #随机赋值

Data <- data.frame(Group=Group,Attribute=Attribute,value=value) #生成数据框

需要注意的时,绘制条形图和误差条图需要对原始数据进行适当的计算,如求均值,标准差,标准误和置信区间等。可以通过以下函数实现。以下函数来自:
http://www.cookbook-r.com/Manipulating_data/Summarizing_data/
需要确保已经安装好plyr包。如果没有安装,运行以下命令进行安装:install.packages(“plyr”)。plyr包用于数据整理很方便。

#对数据进行统计的函数
#指定分组变量和求值变量后,可计算出不同分组变量(或分组变量间的组合)对应的求值变量的均值,标准差,标准误,置信区间ci

#汇总数据
#计算出计数,平均值,标准差,均值的标准误差和置信区间(默认为95%)
#data:一个数据框
#measurevar:包含要汇总的变量的列的名称
#groupvars:包含分组变量的列名称的向量
#na.rm:一个布尔值,表示是否忽略NA
## conf.interval:置信区间的百分比范围(默认为95%)

## Summarizes data.
## Gives count, mean, standard deviation, standard error of the mean, and confidence interval (default 95%).
##   data: a data frame.
##   measurevar: the name of a column that contains the variable to be summariezed
##   groupvars: a vector containing names of columns that contain grouping variables
##   na.rm: a boolean that indicates whether to ignore NA's
##   conf.interval: the percent range of the confidence interval (default is 95%)
summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
   
  library(plyr)
  
  # New version of length which can handle NA's: if na.rm==T, don't count them
  length2 <- function (x, na.rm=FALSE) {
   
    if (na.rm) sum(!is.na(x))
    else       length(x)
  }
  
  # This does the summary. For each group's data frame, return a vector with
  # N, mean, and sd
  datac <- ddply(data, groupvars, .drop=.drop,
                 .fun = function(xx, col) {
   
                   c(N    = length2(xx[[col]], na.rm=na.rm),
                     mean = mean   (xx[[col]], na.rm=na.rm),
                     sd   = sd     (xx[[col]], na.rm=na.rm)
                   )
                 },
                 measurevar
  )
  
  # Rename the "mean" column    
  datac <- rename(datac, c("mean" = measurevar))
  
  datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
  
  # Confidence interval multiplier for standard error
  # Calculate t-statistic for confidence interval: 
  # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
  ciMult <- qt(conf.interval/2 + .5, datac$N-1)
  datac$ci <- datac$se * ciMult
  
  return(datac)
}

基于summarySE()函数依据数据中的不同组别变量之间的组合对变量value计算对应的计数,均值,标准差,标准误及置信区间。

代码如下:

#依据分组对vale进行统计
Data_summary <- summarySE(Data, measurevar="value", groupvars=c("Group","Attribute"))

执行结果如下:

   Group   Attribute   N    value        sd         se        ci
1 group1 Attribute_1 100 1.035840 1.0497560 0.10497560 0.2082944
2 group1 Attribute_2 100 1.918411 0.9575014 0.09575014 0.1899890
3 group2 Attribute_1 100 1.073857 0.9276357 0.09276357 0.1840630
4 group2 Attribute_2 100 1.590875 0.9526457 0.09526457 0.1890256

其中,结果表示Group和Attribute的不同组合下对变量value进行计算,N表示计数,value表示value的均值,sd表示value的标准差,se表示value的标准误,ci可用于计算value的95%的置信区间,value的95%的置信区间为[value的均值-ci, value的均值+ci]。

先使用条形图结合误差条图表达数据,代码如下:

P1 <- ggplot(Data_summary,aes(x=Group, y=value, fill=Attribute)) + #“fill=”设置填充颜色依据Attribute指定
  geom_point(aes(x=Group, y=value),pch=19,position=position_dodge(0.9),size=2.5)+ #绘制均值为点图
  geom_bar(stat = "identity",position = "dodge",alpha = 0.7) + #绘制条形图
  
  #如果误差条想表示标准差:请设置 ymin = value-sd, ymax=value+sd
  #如果误差条想表示标准误:请设置 ymin = value-se, ymax=value+se
  geom_errorbar(aes(ymin = value-ci, ymax=value+ci), #误差条表示95%的置信区间
                width=0.1, #误差条末端短横线的宽度
                position=position_dodge(0.9), 
                color="black",
                alpha = 0.7,
                size=0.5) +
  scale_fill_manual(values = c("#56B4E9", "#E69F00"))+ #设置填充颜色
  theme_bw()+ #背景变为白色
  theme(axis.text.x=element_text(angle=15,hjust = 1,colour="black",family="Times",size=20), #设置x轴刻度标签的字体显示倾斜角度为15度,并向下调整1(hjust = 1),字体簇为Times大小为20
        axis.text.y=element_text(family="Times",size=16,face="plain"), #设置y轴刻度标签的字体簇,字体大小,字体样式为plain
        axis.title.y=element_text(family="Times",size = 20,face="plain"), #设置y轴标题的字体属性
        panel.border = element_blank(),axis.line = element_line(colour = "black",size=1), #去除默认填充的灰色,并将x=0轴和y=0轴加粗显示(size=1)
        legend.text=element_text(face="italic", family="Times", colour="black",  #设置图例的子标题的字体属性
                                 size=16),
        legend.title=element_text(face="italic", family="Times", colour="black", #设置图例的总标题的字体属性
                                  size=18),
        panel.grid.major = element_blank(),   #不显示网格线
        panel.grid.minor = element_blank())+  #不显示网格线
  ylab("Value")+xlab("") #设置x轴和y轴的标题

  P1
  jpeg(file = "results_Value_1.jpg",width =1600,height = 2000,units = "px",res =300) #结果保存
  print(P1)
  dev.off()

效果图如下:
在这里插入图片描述

图2 条形图结合误差条图

小提琴图结合箱线图用于表达数据的代码如下:

P2<- ggplot(Data, 
<think>好的,我现在需要帮助用户了解如何在MATLAB中设置小提琴图箱线图和均值点。用户之前已经询问过小提琴图的含义,现在可能想进一步调整表中的元素,比如显示隐藏箱线图,以及添加均值点。首先,我需要回忆之前提供的回答,确保信息的一致性。 用户的问题明确指向设置箱线图和均值点。根据之前的回答,我提到过`violinplot`函数中的参数`ShowBox`和`ShowMean`。现在需要详细解释这些参数的使用方法,可能还需要给出具体的代码示例,让用户能够直接应用。 首先,我需要确认用户是否使用MATLAB的附加工具箱,比如Statistics and Machine Learning Toolbox,者第三方函数如`violinplot`。因为原生的MATLAB可能不支持小提琴图,需要额外函数。在之前的回答中,示例代码使用了`violinplot`,所以可能用户已经安装了该函数,可能需要引用正确的来源,比如File Exchange上的代码。 接下来,我需要步骤说明如何设置箱线图和均值点。参数`ShowBox`默认可能是显示的,所以用户如果想隐藏,需要设置为false。同样,`ShowMean`可能默认不显示,需要显式开启。需要确保用户知道如何调整这些参数,可能修改它们的样式,比如颜色、大小等。 然后,可能需要考虑常见的错误问题,比如参数拼写错误,者函数版本不同导致参数名称变化。此外,用户可能想自定义箱线图的颜色均值点的样式,这部需要提供示例代码,展示如何通过句柄修改形属性。 另外,用户可能对如何组合多个参数感兴趣,比如同时显示箱线图和均值点,调整它们的颜色。这时候需要给出一个综合的示例,让用户能够复制粘贴看到效果。 还需要注意代码的可读性,添加注释,帮助用户理解每一行的作用。例如,生成模拟数据、绘制小提琴图、设置标题和标签、调整字体大小等步骤都需要明确说明。 最后,可能还需要提醒用户一些注意事项,比如数据预处理的重要性,形美化的小技巧,比如使用感知均匀的色系,避免视觉误导。这些内容在之前的回答中已经提到过,可以适当重复引用,以加强用户的记忆。 总结来说,我需要提供一个结构清晰的回答,步骤讲解如何设置箱线图和均值点,括基本参数说明、代码示例、样式自定义以及常见问题。确保用户能够跟随步骤操作,理解每个参数的作用。同时,保持回答的准确性和实用性,避免引入错误信息。</think>以下是关于在MATLAB中设置小提琴图箱线图与均值点的详细说明: --- ### 一、核心参数设置 MATLAB的`violinplot`函数(需使用第三方工具附加组件)通过以下参数控制箱线图和均值点的显示: #### 1. **箱线图控制参数** ```matlab 'ShowBox' : true(默认显示) / false(隐藏) ``` **示例代码**: ```matlab violinplot(data, groups, 'ShowBox', false) % 隐藏箱线图 ``` #### 2. **均值点控制参数** ```matlab 'ShowMean' : false(默认隐藏) / true(显示) ``` **示例代码**: ```matlab violinplot(data, groups, 'ShowMean', true) % 显示均值点 ``` --- ### 二、完整配置示例 ```matlab % 生成模拟数据 data = {randn(200,1)*1.5+3, randn(250,1)*0.8+5}; % 两组不同方差的数据 groups = {'实验组', '对照组'}; % 绘制箱线图和均值点的小提琴图 figure h = violinplot(data, groups, ... 'ShowBox', true, ... % 强制显示箱线图(默认已开启) 'ShowMean', true, ... % 显示红色菱形均值点 'BoxColor', [0.2 0.6 0.8], ... % 设置箱线颜色为青蓝色 'MeanShape', 'd', ... % 均值点形状:d=菱形 'MeanSize', 12, ... % 点大小 'MeanColor', 'r'); % 点颜色红色 title('两组数据布对比') ylabel('观测值 (units)') set(gca, 'FontSize', 12, 'LineWidth', 1.2) grid on ``` --- ### 三、关键属性调节 通过形对象句柄进行更精细的调整: #### 1. **箱线图样式修改** ```matlab % 获取箱线图对象 boxObj = h(1).BoxPlot; % 第一组的箱线图 % 修改属性 set(boxObj, ... 'LineWidth', 2, ... % 线宽 'MarkerSize', 8, ... % 离群点大小 'BoxFaceColor', [0.9 0.2 0.2]) % 箱体填充色 ``` #### 2. **均值点高级设置** ```matlab % 获取均值点对象 meanMarker = h(1).MeanPlot; % 修改属性 set(meanMarker, ... 'MarkerEdgeColor', 'k', ... % 点边缘颜色 'MarkerFaceColor', 'y', ... % 点填充颜色 'LineWidth', 1.5) % 边缘线宽 ``` --- ### 四、特殊情形处理 #### 场景1:**同时显示均值和中位数** ```matlab % 手动添加中位线 hold on for i=1:length(data) medians(i) = median(data{i}); plot(i, medians(i), 'ks', 'MarkerSize', 10, 'LineWidth', 2) end ``` #### 场景2:**自定义箱线图元素** ```matlab % 关闭默认箱线图后重建 violinplot(..., 'ShowBox', false); boxplot(data, 'Positions', 1:numel(data)) % 叠加标准箱线图 ``` --- ### 五、注意事项 1. **版本兼容性** 不同版本的`violinplot`实现可能参数命名不同,建议检查函数文档 (如Bastian Bechtold的版本支持上述参数,而其他版本可能使用`box`替代`ShowBox`) 2. **视觉优化建议** - 当数据布密集时,调高`BoxWidth`(箱线宽度)避免与核密度曲线重叠 - 对多组数据使用`ColorOrder`属性实现自动配色 3. **统计准确性** - 核密度估计的带宽(`Bandwidth`)会影响均值点位置的可视化效果 - 建议先使用`kstest`验证数据布形态 --- 通过上述配置,可以灵活控制小提琴图箱线图与均值点的显示方式,使数据布特征更直观呈现。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值