背景
柱状图是一种常用的数据可视化图表,通过使用长方形柱条的高度或长度来表示不同类别的数值大小,帮助直观地比较各类别的数据差异,如图b
堆叠柱状图是柱状图的扩展,每个柱条被分成多个颜色不同的部分,每个部分代表一个子类别的数据。在保持整体柱条高度不变的前提下,堆叠柱状图可以显示类别的总量,同时展示各子类别在总量中的占比。它的作用在于方便观察每个类别的细分数据,同时更清晰地看到各部分数据对整体的贡献,如图c
接下来将复现这张图表中的柱状图和堆叠柱状图部分。柱状图将用于展示数据在不同区间的分布,而堆叠柱状图则将展示不同类别的组成比例。此外,还可以进一步使用堆叠面积图,以连续的方式呈现各类别在整体中的比例变化,从而更直观地观察各类别比例随区间变化的趋势
代码实现
数据读取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2024-11-13公众号Python机器学习AI.xlsx')
这个数据集是一个模拟数据集,用于展示和实现图表可视化的效果,数据并不具有实际意义,仅用于演示数据处理、分析和图表绘制等Python编程的可视化操作过程
不同类别的分布柱状图
MOs-projecting
# 绘制MOs-projecting柱状图
plt.figure(figsize=(8, 3), dpi=1200)
plt.bar(df['Cortical Depth (µm)'], df['MOs-projecting'], color='orchid', width=90, label='MOs-projecting', alpha=0.6)
plt.xlabel('Cortical Depth (µm)')
plt.ylabel('Enrichment')
plt.ylim(0, 2.5) # 设置y轴范围
# 移除上方和右方的边框
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# 添加图例,位置在右上方
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1), frameon=False)
plt.savefig('MOs-projecting.pdf', format='pdf', bbox_inches='tight')
plt.show()
SSp-projecting
# 绘制SSp-projecting柱状图
plt.figure(figsize=(8, 3), dpi=1200)
plt.bar(df['Cortical Depth (µm)'], df['SSp-projecting'], color='green', width=90, label='SSp-projecting', alpha=0.6)
plt.xlabel('Cortical Depth (µm)')
plt.ylabel('Enrichment')
plt.ylim(0, 2.5) # 设置y轴范围
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1), frameon=False)
plt.savefig('SSp-projecting.pdf', format='pdf', bbox_inches='tight')
plt.show()
TEa-ECT-PERI-projecting
plt.figure(figsize=(8, 3), dpi=1200)
plt.bar(df['Cortical Depth (µm)'], df['TEa-ECT-PERI-projecting'], color='blue', width=90, label='TEa–ECT–PERI\n-projecting', alpha=0.6)
plt.xlabel('Cortical Depth (µm)')
plt.ylabel('Enrichment')
plt.ylim(0, 2.5)
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1), frameon=False)
plt.savefig('TEa-ECT-PERI-projecting.pdf', format='pdf', bbox_inches='tight')
plt.show()
这里单独绘制三个柱状图是为了方便读者逐一理解和学习不同类别的柱状图效果,接下来,将把这三个柱状图合并在一个画布上,模仿文献中的图表布局,实现一体化的展示效果
单画布中展示各类别柱状图
# 创建共享 x 轴和 y 轴的多个子图
fig, axs = plt.subplots(3, 1, figsize=(8, 4), sharex=True, sharey=True, dpi=1200)
# 设置y轴和x轴的刻度
axs[0].set_yticks([0, 1, 2])
axs[2].set_xticks(np.arange(0, 1700, 200))
# 绘制 MOs-projecting
axs[0].bar(df['Cortical Depth (µm)'], df['MOs-projecting'], color='orchid', width=90, alpha=0.6, label='MOs-projecting')
axs[0].legend(loc='upper right', bbox_to_anchor=(1.15, 1), frameon=False)
axs[0].spines['top'].set_visible(False)
axs[0].spines['right'].set_visible(False)
# 绘制 SSp-projecting
axs[1].bar(df['Cortical Depth (µm)'], df['SSp-projecting'], color='green', width=90, alpha=0.6, label='SSp-projecting')
axs[1].legend(loc='upper right', bbox_to_anchor=(1.15, 1), frameon=False)
axs[1].spines['top'].set_visible(False)
axs[1].spines['right'].set_visible(False)
# 绘制 TEa-ECT-PERI-projecting
axs[2].bar(df['Cortical Depth (µm)'], df['TEa-ECT-PERI-projecting'], color='blue', width=90, alpha=0.6, label='TEa–ECT–PERI\n-projecting')
axs[2].legend(loc='upper right', bbox_to_anchor=(1.15, 1), frameon=False)
axs[2].spines['top'].set_visible(False)
axs[2].spines['right'].set_visible(False)
fig.text(0.04, 0.5, 'Enrichment', va='center', rotation='vertical', fontsize=12)
fig.text(0.5, 0.04, 'Cortical Depth (µm)', ha='center', fontsize=12)
plt.tight_layout(rect=[0.05, 0.05, 1, 1])
plt.savefig('subplot.pdf', format='pdf', bbox_inches='tight')
plt.show()
图表将MOs-projecting、SSp-projecting和TEa–ECT–PERI-projecting三个投射类别的柱状图合并绘制在同一个画布上,通过共享的坐标轴,方便读者直接对比各类别在皮层深度上的分布情况,便于观察其差异和趋势,实现文献中的图表布局
堆叠图
提取坐标数据并归一化处理
# 第一列为坐标数据,将其提取出来
coordinates = df.iloc[:, 0] # 提取第一列
df_data = df.iloc[:, 1:] # 提取其余列用于归一化
# 对其余列进行归一化处理,使得每行的和为 1
df_normalized = df_data.div(df_data.sum(axis=1), axis=0)
将数据集中第一列作为坐标数据提取出来,并对其余列进行归一化处理,使每行的数值和为1,以便后续进行比例或分布的分析和可视化
堆叠条形图
# 绘制堆叠条形图
fig, ax = plt.subplots(figsize=(10, 6),dpi=1200)
df_normalized.plot(kind='bar', stacked=True, ax=ax, width=0.8,
color=['orchid', 'green', 'blue'], alpha=0.6)
# 设置 x 轴和 y 轴标签
ax.set_xlabel('Cortical Depth (µm)', fontsize=12)
ax.set_ylabel('Fraction', fontsize=12)
ax.set_xticks(range(len(coordinates))) # 设置 x 轴刻度位置
ax.set_xticklabels(coordinates, rotation=90) # 使用坐标数据作为 x 轴标签,并旋转90度
# 添加图例
ax.legend(['MOs', 'SSp', 'TEa–\nECT–\nPERI'], loc='upper right', bbox_to_anchor=(1.1, 0.95), frameon=False)
# 去除顶部和右侧边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# 显示图形
plt.tight_layout()
plt.savefig('stack.pdf', format='pdf', bbox_inches='tight')
plt.show()
生成一个堆叠条形图,展示每个坐标点上不同类别的相对比例,通过将数据归一化,每个条形的高度表示1,每种颜色代表一个类别,使得能够一目了然地看到在各坐标点上不同类别的分布情况,这种可视化方式帮助分析各类别在不同位置的相对占比,并观察其随坐标变化的趋势
堆叠面积图
改进生成一个堆叠面积图,与前面的堆叠条形图不同之处在于,它使用平滑的面积层叠效果来展示各类别在不同坐标点上的相对比例,具体来说:
- 堆叠形式:堆叠面积图通过连续的区域面积来显示每个类别的分布变化,而堆叠条形图是由离散的条形组成,这种面积图使数据的趋势更加流畅,有助于观察各类别随坐标连续变化的比例
- 可视化效果:面积图更适合显示随坐标变化的连续性,便于直观观察不同类别在每个位置上的分布趋势,而条形图则便于分段对比
这种堆叠面积图适合表现数据的连续变化,突出各类别的相对趋势,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
🎁 赠书活动来啦!🎁
支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需
点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《GraphPad Prism科技绘图与数据分析》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考