前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用小提琴图探索帕尔默企鹅数据

利用小提琴图探索帕尔默企鹅数据

作者头像
HsuHeinrich
发布于 2025-04-23 06:00:34
发布于 2025-04-23 06:00:34
6900
代码可运行
举报
文章被收录于专栏:HsuHeinrichHsuHeinrich
运行总次数:0
代码可运行

利用小提琴图探索帕尔默企鹅数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st

from palmerpenguins import load_penguins

数据探索

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数据展示
penguins = load_penguins()
penguins.head()
image-20240129165915062
image-20240129165915062

image-20240129165915062

species:企鹅的种类,包括 Adelie、Chinstrap 和 Gentoo 三种。 island:企鹅所在岛屿的名字,包括 Biscoe、Dream 和 Torgersen 三个岛屿。 bill_length_mm:企鹅的喙长,单位毫米。 bill_depth_mm:企鹅的喙深,单位毫米。 flipper_length_mm:企鹅的鳍长,单位毫米。 body_mass_g:企鹅的体重,单位克。 sex:企鹅的性别,包括 Male 和 Female。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数据清洗
penguins = penguins.dropna() # 删除na
species = sorted(penguins["species"].unique()) # 物种列表
y_data = [penguins[penguins["species"] == specie]["bill_length_mm"].values for specie in species] # 获取每个物种的bill_length_mm
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 构造抖动点:避免数据点重叠
jitter = 0.04
x_data = [np.array([i] * len(d)) for i, d in enumerate(y_data)]
x_jittered = [x + st.t(df=6, scale=jitter).rvs(len(x)) for x in x_data]

绘制基础小提琴图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 设置基础信息:包括颜色、位置、水平线

# 颜色
BG_WHITE = "#fbf9f4"
GREY_LIGHT = "#b4aea9"
GREY50 = "#7F7F7F"
BLUE_DARK = "#1B2838"
BLUE = "#2a475e"
BLACK = "#282724"
GREY_DARK = "#747473"
RED_DARK = "#850e00"

COLOR_SCALE = ["#1B9E77", "#D95F02", "#7570B3"] # 取自 RColorBrewer R 库中的 Dark2 调色板

# 位置(三个物种的位置,可以是任意位置:例如[-1, 0, 1]POSITIONS = [0, 1, 2]

# 水平线
HLINES = [40, 50, 60]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 构造基本布局:对于每个物种,依次添加小提琴图、箱线图、抖动数据点

# 初始画布
fig, ax = plt.subplots(figsize= (14, 10))
# 背景色
fig.patch.set_facecolor(BG_WHITE)
ax.set_facecolor(BG_WHITE)
# 水平线:用以参考bill_length_mm的位置
for h in HLINES:
    ax.axhline(h, color=GREY50, ls=(0, (5, 5)), alpha=0.8, zorder=0)
    
# 添加小提琴图框架
violins = ax.violinplot(
    y_data, 
    positions=POSITIONS,
    widths=0.45,
    bw_method="silverman",
    showmeans=False, 
    showmedians=False,
    showextrema=False
)

# 自定义小提琴图(外形设置)
for pc in violins["bodies"]:
    pc.set_facecolor("none")
    pc.set_edgecolor(BLACK)
    pc.set_linewidth(1.4)
    pc.set_alpha(1)
    
# 添加箱线图

medianprops = dict(
    linewidth=4, 
    color=GREY_DARK,
    solid_capstyle="butt"
)
boxprops = dict(
    linewidth=2, 
    color=GREY_DARK
)

ax.boxplot(
    y_data,
    positions=POSITIONS, 
    showfliers = False, # Do not show the outliers beyond the caps.
    showcaps = False,   # Do not show the caps
    medianprops = medianprops,
    whiskerprops = boxprops,
    boxprops = boxprops
)

# 添加抖动数据点
for x, y, color in zip(x_jittered, y_data, COLOR_SCALE):
    ax.scatter(x, y, s = 100, color=color, alpha=0.4)
    
png
png

添加自定义注释

众所周知,可视化好不好看,全凭注释是否精(花)准(哨)。接下来就是最考验技术的地方了!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加平均值标签
means = [y.mean() for y in y_data]
for i, mean in enumerate(means):
    # 添加代表平均值的点
    ax.scatter(i, mean, s=250, color=RED_DARK, zorder=3)
    
    # 添加连接平均值及其标签的线
    ax.plot([i, i + 0.25], [mean, mean], ls="dashdot", color="black", zorder=3)
    
    # 添加平均值标签
    ax.text(
        i + 0.25,
        mean,
        r"$\hat{\mu}_{\rm{mean}} = $" + str(round(mean, 2)),
        fontsize=13,
        va="center",
        bbox = dict(
            facecolor="white",
            edgecolor="black",
            boxstyle="round",
            pad=0.15
        ),
        zorder=10 # 确保该线位于顶部
    )

# 添加均值差的p值信息(多重比较)
tick_len = 0.25 # 首位端刻度长短
ax.plot([0, 0, 1, 1], [62.5 - tick_len, 62.5, 62.5, 62.5 - tick_len], c="black")
ax.plot([0, 0, 2, 2], [65 - tick_len, 65, 65, 65 - tick_len], c="black")
ax.plot([1, 1, 2, 2], [67.5 - tick_len, 67.5, 67.5, 67.5 - tick_len], c="black")

# 添加p值标签
label1 = r"$p_{\rm{Holm-corrected}}$ = 8.42e-14"
label2 = r"$p_{\rm{Holm-corrected}}$ = 4.3e-14"
label3 = r"$p_{\rm{Holm-corrected}}$ = 0.031"

pad = 0.2 # 文本距离实现的距离
ax.text(0.5, 62.5 + pad, label1, fontsize=11, va="bottom", ha="center")
ax.text(1, 65 + pad, label2, fontsize=11, va="bottom", ha="center")
ax.text(1.5, 67.5 + pad, label3, fontsize=11, va="bottom", ha="center") 

fig
output_14_0
output_14_0

为图表增加更丰富的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 自定义布局

# 隐藏右边/上边的框
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# 定义边框颜色和线宽
ax.spines["left"].set_color(GREY_LIGHT)
ax.spines["left"].set_linewidth(2)
ax.spines["bottom"].set_color(GREY_LIGHT)
ax.spines["bottom"].set_linewidth(2)

# 自定义标签和刻度
ax.tick_params(length=0)
ax.set_yticks(HLINES)
ax.set_yticklabels(HLINES, size=15)
ax.set_ylabel("Bill Length", size=18, weight="bold")

# x轴上添加各物种数量信息
xlabels = [f"{specie}\n(n={y_data[i].size})" for i, specie in enumerate(species)]
ax.set_xticks(POSITIONS)
ax.set_xticklabels(xlabels, size=15, ha="center", ma="center")
ax.set_xlabel("Penguin Species", size=18, weight="bold")

# 自定义标题与副标题
# 标题
stats = [
    r"$\log_{\rm{e}}(\rm{BF}_{01})=-195.59$",
    r"$\widehat{R^2}_{\rm{Bayesian}}^{\rm{posterior}}=0.70$",
    r"$\rm{CI}_{95\%}^{\rm{HDI}}[0.67, 0.73]$",
    r"$r^{\rm{Cauchy}}_{\rm{JZS}} = 0.71$",
]

fig.suptitle(
    "Distribution of bill length across penguins species",
    x = 0.122,
    y = 0.975,
    ha="left",
    fontsize=26,
    fontname="Lobster Two",
    color=BLUE,
    weight="bold",  
)
    
# 子标题   
stats = [
    r"$F_{\rm{Welch}}$(2, 165.34)=409.93",
    r"p=8.27e-65",
    r"$\widehat{\omega_p^2}$=0.83",
    r"CI$_{95\%}$[0.79, 0.86]",
    r"n$_{\rm{obs}}$=333"
]

ax.set_title(
    ", ".join(stats),
    loc="left",
    ha="left",
    fontsize=20,
    color=BLUE_DARK
)
    
# 右下角添加文本注释
fig.text(
    0.55,
    0.03,
    ", ".join(stats),
    fontsize=10
)

fig.text(
    0.55,
    0.005,
    r"Pairwise test: $\bf{Games-Howell}$ $\bf{test}$; Comparisons shown: $\bf{Only}$ $\bf{significant}$",
    fontsize=10
)

fig
output_16_0
output_16_0

参考:Palmer Penguins exploration with violinplots in Matplotlib[1]

共勉~

参考资料

[1]

Palmer Penguins exploration with violinplots in Matplotlib: https://python-graph-gallery.com/web-ggbetweenstats-with-matplotlib/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用散点图探索帕尔默企鹅数据
参考:Scatterplot with labels and text repel in Matplotlib[1]
HsuHeinrich
2025/04/29
580
利用散点图探索帕尔默企鹅数据
(在模仿中精进数据可视化05)疫情期间市值增长top25公司
  新冠疫情对很多实体经济带来冲击的同时,也给很多公司带来了新的增长点。前段时间我看到图1所示的数据可视化作品,针对2020年1月1日到6月16日之间,世界范围内市值增大最多的25家公司进行可视化:
Feffery
2020/12/01
3440
(在模仿中精进数据可视化05)疫情期间市值增长top25公司
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(下)
昨天我们跟大家分享了50个Matplotlib可视化 - 主图(带有完整的Python代码)上 ,详情链接请戳:50个Matplotlib可视化 - 主图(带有完整的Python代码)上
Datawhale
2019/10/18
2.2K0
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(下)
Python-matplotlib 商业图表绘制03
本篇推文为python-matplotlib 商业图表绘制的第三篇文章,主要内容为圆润柱状图的绘制,这也是我之前一直想做的事情,在浏览Matplotlib官网时,发现了一个方法,就试着进行绘制,效果还不错。接下来,我们开始
DataCharm
2021/02/22
6050
Python-matplotlib 商业图表绘制03
数据可视化:疫情期间市值增长top25公司
今年肆虐全球的新冠疫情给世界各国经济都造成了相当大的影响,尤其对很多实体经济带来巨大冲击。不过,这期间也有不少公司保持了较高的增长。前段时间我看到一张数据图表(图1),针对2020年1月1日到6月16日之间,世界范围内市值增大最多的25家公司进行可视化:
Crossin先生
2020/12/22
4510
数据可视化:疫情期间市值增长top25公司
(在模仿中精进数据可视化06)常见抽象地图的制作方法
  我们经常会在一些PPT报告或者宣传广告中看到一些比较抽象的地图,它们都是在正常地图的基础上,通过置换几何元素,来实现出较为抽象的效果,这类的作品非常之多,因此本文不模仿实际的某幅作品,而是制作出下面三类抽象地图:
Feffery
2021/01/05
9440
(在模仿中精进数据可视化06)常见抽象地图的制作方法
Python-seaborn 基础图表绘制-散点图
上期推文推出第一篇基础图表绘制-R-ggplot2 基础图表绘制-散点图 的绘制推文,得到了很多小伙伴的喜欢,也是我更加想使这个系列做的更加完善和系统,我之前也有说过,会推出Python和R的两个版本绘制教程,接下来我们就推出基础散点图的Python绘制版本。本期主要涉及的知识点如下:
数据森麟
2020/11/23
1.6K0
Python-seaborn 基础图表绘制-散点图
python学习之matplot
import matplotlib.pyplot as plt import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.gridspec as gridspec from matplotlib import animation
py3study
2020/01/08
8090
Matplotlib 1.4W+字基础教程来了(收藏吃灰去吧~~)
参考:Rougier N P, Droettboom M, Bourne P E, et al. Ten Simple Rules for Better Figures[J]. PLOS Computational Biology【IF 4.7】, 2014, 10(9).感兴趣戳:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4161295/pdf/pcbi.1003833.pdf
DataCharm
2021/02/22
1.5K0
Matplotlib 1.4W+字基础教程来了(收藏吃灰去吧~~)
数据可视化 | seaborn绘制散点图
由于涉及的图表类型为多类别散点图的绘制,在使用常规matplotlib进行绘制时会显得格外繁琐,所以我们选择了对matplotlib进行了更高级的API封装,使作图更加容易的seaborn包进行图表的绘制,更多seaborn 介绍,大家可以直接去seaborn官网进行相关资料的查阅。数据的读取使用的功能强大的数据处理包 pandas ,这里只是进行简单的删除空值操作,直接使用dropna() 函数操作即可,我们直接预览数据,如下(部分):
郭好奇同学
2020/11/25
2K0
数据可视化 | seaborn绘制散点图
Python-matplotlib 绘图配色设计
色彩搭配对图表的第一印象至关重要,合理的设置对图表的颜值提升有着很大的帮助,本期推文结合一个具体例子对图表颜色搭配进行讲解。
DataCharm
2021/02/22
1.5K0
Python-matplotlib 绘图配色设计
Python-matplotlib 学术柱状图绘制
柱状图或条形图在学术论文中使用的频率还是很大的,图中需要以不同颜色对不同数据进行区分,但当涉及黑白打印时,色彩颜色的区别度较小,导致难以理解,因此需要绘制黑灰颜色或者黑白阴影的柱状图或者条形图,下面就具体介绍使用Python-matplotlib 的实现过程。
气象学家
2020/07/17
4.8K0
Python-matplotlib 学术柱状图绘制
一行代码简单搞定matplotlib柱状图显示数据标签
在用matplotlib绘制柱状图的时候,往往需要将数据显示在柱状图上,今天我们就简单介绍一下。
可以叫我才哥
2021/08/05
16.6K0
Python数据处理从零开始----第四章(可视化)(16)一文解决小提琴图violin plot
(1)输入数据 所使用的是经典的iris数据, 包括有sepal_length, sepal_width, petal_length,petal_width和 species五个变量,其中前四个为数字变量,最后一个为分类变量 import seaborn as sns df = sns.load_dataset('iris') df.head() Out[25]: sepal_length sepal_width petal_length petal_width species 0
用户1359560
2020/02/18
8640
Python数据处理从零开始----第四章(可视化)(16)一文解决小提琴图violin plot
(在模仿中精进数据可视化04)旧金山街道树木分布可视化
  开门见山,今天我们要模仿的数据可视化作品来自#TidyTuesday活动于2020年1月28日发布的旧金山街道树木数据集下的众多参赛作品中,由Philippe Massicotte创作的(如图1所示)非常受欢迎的Street trees of San Francisco:
Feffery
2020/11/24
6400
(在模仿中精进数据可视化04)旧金山街道树木分布可视化
matplotlib 小提琴图(violin plot)
这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。中间白点为中位数,中间的黑色粗条表示四分位数范围。上下贯穿小提琴图的黑线代表最小非异常值min到最大非异常值max的区间,线上下端分别代表上限和下限,超出此范围为异常数据。(或者,从黑色粗条延伸的细黑线代表 95% 置信区间)
用户6021899
2019/08/14
13.7K0
python数据可视化之画箱形图
最近接到锅让画几个数据图。其实第一反应是用origin来画图,但问了一圈周围没有用Origin画过箱形图的,有些问题无法解决又百度不到。但好在略懂一点python的matplotlib画图,于是决定换个更适合程序员的画图工具。
我爱自然语言处理
2018/05/21
6.4K2
python数据可视化之画箱形图
一文汇总Python可视化工具及图表
正所谓“一图胜千言”,数据可视化是数据科学中重要的一项工作,在面对海量的大数据中,如果没有图表直观的展示复杂数据,我们往往会摸不着头脑。通过可视化的图表可以直观了解数据潜藏的重要信息,以便在业务和决策中发现数据背后的价值!
算法进阶
2023/10/26
8450
一文汇总Python可视化工具及图表
Python数据分析--折线图
最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
MiaoGIS
2022/04/21
1.4K0
Python数据分析--折线图
Matpotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法
最近有小伙伴私信我关于matplotlib时间类型刻度的设置问题,第一感觉就是官网有好多例子介绍啊
数据森麟
2020/09/24
3K0
Matpotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法
推荐阅读
相关推荐
利用散点图探索帕尔默企鹅数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验