一、小提琴图的定义
小提琴图是一种数据可视化工具,它结合了箱型图和核密度估计图的特点,使得我们能够更全面地了解数据的分布特征。
小提琴图是一种统计图表,它通过图形化的方式展示了数据的分布密度。与传统的箱型图相比,小提琴图提供了更多的信息,因为它不仅显示了数据的中位数、四分位数和异常值,还通过图形的宽度变化来表示数据的密度。这种图表特别适用于展示多个组别或变量的数据分布,使得我们可以在单一视图中比较它们的分布特征。
在小提琴图中,每个组别或变量都有一个对应的“小提琴”图形。图形的中心线通常代表中位数,而图形的宽度则根据数据点的密度变化。数据点越多的区域,小提琴的“身体”就越宽,这直观地反映了该区间内数据的集中程度。
此外,小提琴图还可以通过颜色的深浅来进一步区分不同组别或变量的数据分布。
示例
让我们以Reddit的/r/samplesize线程上提出的关于“非常可能”这个短语的概率感知问题为例,来展示如何使用小提琴图来分析数据。
假设我们收集了不同用户对于“非常可能”这个短语所赋予的概率值,这些值的范围从0到100。我们可以使用小提琴图来展示这些数据的分布情况:
-
数据收集:首先,我们需要从每个问题的回答中收集数据,记录下每个用户给出的概率值。
-
数据整理:将收集到的数据按照问题进行分类,每个问题对应一个组别或变量。
-
绘制小提琴图:使用统计软件或编程语言(如R语言或Python)绘制小提琴图。在图中,每个问题都会有一个对应的小提琴图形。
-
分析与比较:通过观察小提琴图,我们可以比较不同问题下用户对“非常可能”这个短语的概率感知。例如,如果某个问题的小提琴图在高概率区域更宽,这可能意味着大多数用户认为这个问题的事件发生概率较高。
-
深入理解:小提琴图不仅显示了数据的集中趋势,还揭示了数据的分布形状。例如,如果某个小提琴图呈现出明显的偏态,这可能表明用户对概率的感知存在分歧。
通过这种方式,小提琴图帮助我们更深入地理解数据的分布特征,为数据分析提供了一种直观且信息丰富的视觉工具。
代码演示
# Libraries
# 导入所需的库
library(tidyverse) # 包含了dplyr, ggplot2等数据处理和绘图库
library(hrbrthemes) # 提供了一些高级的ggplot2主题
library(viridisLite) # 提供了viridis颜色调色板
library(viridis) # 提供了viridis颜色调色板的完整版本
# Load dataset from github
# 从GitHub加载数据集
data <- read.table("https://raw.githubusercontent.com/zonination/perceptions/master/probly.csv", header=TRUE, sep=",")
# 使用tidyverse中的gather函数将数据从宽格式转换为长格式
data <- data %>%
gather(key="text", value="value") %>%
# 将"text"列中的点号替换为空格
mutate(text = gsub("\\.", " ",text)) %>%
# 将"value"列转换为数值类型并四舍五入到整数
mutate(value = round(as.numeric(value),0)) %>%
# 筛选出特定的文本标签
filter(text %in% c("Almost Certainly","Very Good Chance","We Believe","Likely","About Even", "Little Chance", "Chances Are Slight", "Almost No Chance"))
# Plot
# 创建图表
data %>%
# 根据"value"列的值对"text"列进行重新排序
mutate(text = fct_reorder(text, value)) %>%
ggplot( aes(x=text, y=value, fill=text, color=text)) + # 设置绘图的数据和美学映射
# 添加小提琴图层
geom_violin(width=2.1, size=0.2) +
# 设置填充颜色为viridis调色板
scale_fill_viridis(discrete=TRUE) +
# 设置线条颜色为viridis调色板
scale_color_viridis(discrete=TRUE) +
# 设置图表主题为最小化
theme_minimal() +
# 设置图例位置为无
theme(
legend.position="none"
) +
# 横纵坐标翻转
coord_flip() +
# 设置x轴标签为空
xlab("") +
# 设置y轴标签为"Assigned Probability (%)"
ylab("Assigned Probability (%)")
二、用途
小提琴图不仅是一种数据可视化技术,更是一种强有力的分析工具,它在多个层面上提供了对数据集的深入理解。
-
多组数据比较:小提琴图非常适合用于比较多个组别的数据分布情况。通过并排展示多个小提琴图,我们可以直观地看出不同组别的数据分布差异,包括中心趋势、分散程度以及潜在的偏态。
-
数据密度展示:与箱型图相比,小提琴图通过图形的宽度变化来展示数据的密度,这使得它能够更精细地反映数据的分布特征。在小提琴图中,图形的宽度直接与数据点的密度成正比,从而提供了数据分布的直观感受。
-
大数据集分析:当数据量非常大时,传统的散点图或箱型图可能无法有效展示数据的全貌。小提琴图通过核密度估计来展示数据的分布,使得我们能够在一个紧凑的图形中观察到大数据集中的模式和趋势。
-
异常值识别:虽然小提琴图的主体部分专注于展示数据的密度,但它也可以通过附加的点或线来表示异常值。这有助于我们在分析大数据集时,快速识别出可能影响整体分布的异常点。
-
小数据集的局限性:对于小数据集,小提琴图可能不如箱型图直观。箱型图通过展示所有数据点(或通过抖动技术来避免重叠),能够提供关于单个观测的更多信息。在这种情况下,箱型图可以更准确地反映数据的实际情况。
-
美观与信息的平衡:小提琴图在视觉上更为优雅,能够吸引观众的注意力。然而,它牺牲了一部分信息的透明度,特别是对于数据点较少的情况。因此,在选择使用小提琴图时,需要权衡其美观性和信息的完整性。
-
适应性:小提琴图可以适应不同的数据类型和场景。无论是连续数据还是有序分类数据,小提琴图都能够提供有用的视觉表示。此外,它还可以与其他类型的图表(如箱型图、散点图)结合使用,以提供更全面的数据分析视角。
-
交互性:在现代的数据可视化工具中,小提琴图可以设计为交互式的,允许用户通过悬停或点击来获取更多关于数据点的信息。这种交互性进一步提高了数据探索的深度和灵活性。
三、变体
小提琴图是一种数据可视化技术,它结合了箱型图和核密度估计图的特点,用于展示数据的分布情况。这种图表特别适用于比较多个组别的数据分布,并且可以展示数据的密度和分布形状。
-
水平小提琴图:虽然大多数小提琴图是垂直制作的,但在某些情况下,尤其是标签较长时,水平版本的小提琴图可以使标签更加易读。
-
小提琴图与箱型图结合:在小提琴图中显示箱型图是可能的,这种结合允许观察者快速评估中位数和四分位数,提供了数据分布的更多细节。
-
小提琴图的衍生类型:除了基本的小提琴图,还有水平小提琴图、带有散点的小提琴图以及分半小提琴图等衍生类型,这些变体提供了不同的数据展示方式。
-
小提琴图的内部元素:小提琴图的内部可以包含不同的统计图形,例如微型箱型图、四分位数线或具体数据点的表示,这些内部元素有助于更深入地理解数据的分布特征。
-
小提琴图的参数调整:在绘制小提琴图时,可以通过调整参数如带宽(bw_method)、密度图的修剪(cut)、小提琴的宽度(width)等来优化图表的展示效果。
-
小提琴图的美学定制:为了提高图表的可读性和吸引力,可以对小提琴图进行美学定制,包括颜色、线条宽度、填充效果等,以适应不同的展示需求。
-
小提琴图的软件实现:不同的软件和编程语言提供了绘制小提琴图的功能,例如Python中的Seaborn库、R语言的ggplot2包以及GraphPad Prism等,这些工具使得创建定制化的小提琴图变得简单快捷。
通过这些变体和定制选项,小提琴图成为了一种灵活且功能强大的数据可视化工具,适用于各种数据分析和展示场景。
小提琴图+箱线图
# create a dataset
# 创建一个数据集
data <- data.frame(
name=c( rep("A",500), rep("B",500), rep("B",500), rep("C",20), rep('D', 100) ), # 创建名为"name"的列,包含不同组别的重复值
value=c( rnorm(500, 10, 5), rnorm(500, 13, 1), rnorm(500, 18, 1), rnorm(20, 25, 4), rnorm(100, 12, 1) ) # 创建名为"value"的列,包含每个组别的随机正态分布数值
)
# sample size
# 计算每个组别的样本大小
sample_size = data %>% group_by(name) %>% summarize(num=n())
# Plot
# 创建图表
data %>%
# 将数据集与样本大小的数据框进行左连接
left_join(sample_size) %>%
# 创建新列"myaxis",包含组别名称和样本大小信息
mutate(myaxis = paste0(name, "\n", "n=", num)) %>%
ggplot( aes(x=myaxis, y=value, fill=name)) + # 设置绘图的数据和美学映射
# 添加小提琴图层
geom_violin(width=1.4) +
# 添加箱线图层,设置宽度、颜色和透明度
geom_boxplot(width=0.1, color="grey", alpha=0.2) +
# 设置填充颜色为viridis调色板
scale_fill_viridis(discrete = TRUE) +
# 设置图表主题为最小化
theme_minimal() +
# 设置图表主题的其他属性,包括隐藏图例和设置标题字体大小
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
# 添加图表标题
ggtitle("A Violin wrapping a boxplot") +
# 设置x轴标签为空
xlab("")
分组小提琴图
分组小提琴图是一种强大的可视化手段,它能够让观察者在同一张图表中比较不同分组的数据分布。
-
分组小提琴图的构建:与箱型图类似,分组小提琴图通过将数据分为不同的组别来展示。在小提琴图中,每个组别都有其对应的图形,通过颜色、标签或其他视觉元素区分。
-
解读分组小提琴图:在分组小提琴图中,每个组别的小提琴形状展示了该组数据的分布密度。观察者可以通过比较不同分组的小提琴形状来了解数据分布的相似之处和差异。
-
示例分析:以男性和女性在一周内不同日子的小费金额为例,我们可以构建一个分组小提琴图,其中X轴代表不同的日期(例如周一到周日),Y轴代表小费金额,而每个日期的男性和女性小费金额分别用不同颜色的小提琴图表示。
-
数据分布的比较:通过观察不同颜色的小提琴图,我们可以比较男性和女性在各个日子的小费金额分布。例如,如果某个日子的男性小费金额小提琴图比女性更宽,这可能意味着男性在那天的小费金额变化范围更广。
-
中位数和四分位数的观察:在分组小提琴图中,通常还会展示中位数(如小提琴图上的白点)和四分位数范围(如小提琴中心的黑色条)。这有助于观察者快速了解每个分组的中心趋势和数据的分散程度。
-
异常值的识别:虽然小提琴图的主要目的是展示数据分布,但异常值也可以通过超出小提琴图主体范围的点来识别。
-
趋势和模式的识别:通过观察一周内每天的小提琴图,我们可以识别出小费金额在一周中的分布模式。例如,周末的小费金额可能普遍高于工作日。
-
美学和设计:为了提高图表的可读性和吸引力,可以通过调整颜色、添加图例、优化标签和标题等方式来增强分组小提琴图的视觉效果。
-
数据的深入分析:分组小提琴图可以作为数据探索的起点,引导进一步的统计分析,如t检验或方差分析,以确定不同分组间的差异是否具有统计学意义。
-
应用场景:分组小提琴图适用于多种场景,包括但不限于市场研究、社会科学、生物统计学和教育评估,它为研究者提供了一种直观的工具来探索和展示数据。
以下是一个示例,展示了男性和女性在一周内不同日子的小费金额。
# Load dataset from github
# 从GitHub加载数据集
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/10_OneNumSevCatSubgroupsSevObs.csv", header=T, sep=",") %>%
# 计算小费占总账单的百分比,并保留一位小数
mutate(tip = round(tip/total_bill*100, 1))
# Grouped
# 创建分组图表
data %>%
# 根据小费百分比重新排序日子,并将结果转换为因子
mutate(day = fct_reorder(day, tip)) %>%
# 设置日子的顺序为星期四到星期日
mutate(day = factor(day, levels=c("Thur", "Fri", "Sat", "Sun"))) %>%
ggplot(aes(fill=sex, y=tip, x=day)) + # 设置绘图的数据和美学映射
# 添加小提琴图层,设置位置为分组以避免重叠,透明度为0.5,去除离群点的颜色
geom_violin(position="dodge", alpha=0.5, outlier.colour="transparent") +
# 设置填充颜色为viridis调色板,不显示图例名称
scale_fill_viridis(discrete=T, name="") +
# 设置图表主题为最小化
theme_ministic() +
# 设置x轴标签为空
xlab("") +
# 设置y轴标签为"Tip (%)"
ylab("Tip (%)") +
# 设置y轴的范围为0到40
ylim(0,40)
这段代码首先加载了一个包含小费和总账单数据的数据集,并计算了小费占总账单的百分比。然后,它根据小费百分比对日子进行了重新排序,并设置了日子的顺序。
最后,它使用ggplot2创建了一个小提琴图,展示了不同日子和性别下的小费百分比分布情况,并使用了viridis颜色调色板来增强视觉效果。
四、常见注意事项
在构建分组小提琴图时,以下是一些重要的注意事项,以确保图表的有效性和易读性:
-
样本量差异的展示:如果比较的组别之间样本量差异很大,这一点应该在图表中展示出来,以便观察者可以考虑到样本量对数据分布的影响 。
-
按中值排序:将组别按中值进行排序可以使图表更具洞察力,因为这样可以帮助观察者快速识别哪些组的中心趋势较高或较低 。
-
脊线图的使用:对于只有少数几个组的情况,可能对脊线图(Ridgeline Plots)感兴趣,这种图表可以同时显示几个组的数值分布情况,并且这些分布与相同的水平尺度对齐,并略有重叠,适合用来可视化随时间或空间变化的多个分布变化 。
-
数据准确性和完整性:确保所使用的数据是准确和完整的,避免因数据质量问题导致分析结果出现偏差 。
-
可视化设计原则:选择合适的图表类型和颜色方案,确保图表简洁明了、易于理解 。
-
用户体验和交互性:设计交互式的可视化界面,使用户能够自由地探索数据并获取所需的信息 。
-
图表的个性化调整:图形页面参数设置区,每种图形包含几十种参数,一键式调整,点击鼠标轻松完成,支持多种图形格式导出,打破绘图壁垒 。
-
实时交互方式:利用图表的实时交互功能,可以降低绘图难度,节省时间,并提高数据挖掘效率 。
-
多维度数据挖掘:整合多种图形,如柱状图、火山图、散点图、韦恩图、热图、小提琴图和雷达图,实现不同角度差异基因数据可视化 。
通过考虑这些注意事项,可以创建出既美观又实用的分组小提琴图,有效地传达数据中的信息。
代码演示
这段代码使用R语言和ggplot2库以及ggridges扩展包来创建一个密度山脊图(density ridges plot),这是一种展示数据分布的可视化方法,特别适合于展示多个类别的概率密度。
# Load dataset from github
# 从GitHub加载数据集
data <- read.table("https://raw.githubusercontent.com/zonination/perceptions/master/probly.csv", header=TRUE, sep=",")
# 使用tidyverse中的gather函数将数据从宽格式转换为长格式
data <- data %>%
gather(key="text", value="value") %>%
# 将"text"列中的点号替换为空格
mutate(text = gsub("\\.", " ",text)) %>%
# 将"value"列转换为数值类型并四舍五入到整数
mutate(value = round(as.numeric(value),0)) %>%
# 筛选出特定的文本标签
filter(text %in% c("Almost Certainly","Very Good Chance","We Believe","Likely","About Even", "Little Chance", "Chances Are Slight", "Almost No Chance"))
# 加载ggridges库,用于创建密度山脊图
library(ggridges)
# 创建密度山脊图
data %>%
# 根据"value"列的值对"text"列进行重新排序
mutate(text = fct_reorder(text, value)) %>%
ggplot( aes(y=text, x=value, fill=text)) + # 设置绘图的数据和美学映射
# 添加密度山脊图层,设置透明度和带宽
geom_density_ridges(alpha=0.6, bandwidth=4) +
# 设置填充颜色为viridis调色板
scale_fill_viridis(discrete=TRUE) +
# 设置线条颜色为viridis调色板(尽管在这个图表中没有用到线条颜色)
scale_color_viridis(discrete=TRUE) +
# 设置图表主题为最小化
theme_minimal() +
# 设置图表主题的其他属性,包括隐藏图例、调整面板间距和文本大小
theme(
legend.position="none",
panel.spacing = unit(0.1, "lines"),
strip.text.x = element_text(size = 8)
) +
# 设置x轴标签为空
xlab("") +
# 设置y轴标签为"Assigned Probability (%)"
ylab("Assigned Probability (%)")
这段代码首先加载了一个包含概率描述文本和对应数值的数据集,并对数据进行了清洗和筛选,只保留了特定的概率描述。然后,它使用ggridges库创建了一个密度山脊图,展示了不同概率描述下的数值分布情况,并使用了viridis颜色调色板来增强视觉效果。
标签:24,小提琴,展示,18,08,viridis,图表,text,数据 From: https://blog.csdn.net/qq_45404805/article/details/141292519