SCI论文分组箱线图代码复刻
分组箱线图如下,图片表示三个气候区28个主要城市区域的AS、水体和植被的总体比例情况,绘制分组箱线图来展示。
代码复刻
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
# 设置全局的字体大小和样式
plt.rcParams["font.size"] = 12
plt.rcParams["font.family"] = "Times New Roman"
plt.figure(figsize=(10, 6), dpi=300)
# 生成示例数据
data = {
'subtropical': {
'AS': np.random.rand(28),
'water': np.random.rand(28),
'vegetation': np.random.rand(28)
},
'temperate': {
'AS': np.random.rand(28),
'water': np.random.rand(28),
'vegetation': np.random.rand(28)
},
'Arid': {
'AS': np.random.rand(28),
'water': np.random.rand(28),
'vegetation': np.random.rand(28)
}
}
# 设置箱线图的颜色(使用snipate提取颜色)
colors = ['#ef0000', '#008000', '#fec211']
# 创建一个子图
fig, ax = plt.subplots()
# 设置箱体的宽度
box_width = 0.5 # 设置箱体宽度,根据需要调整
positions = [] # 用于存储每个气候带的箱线图的位置
# 遍历每个气候带的数据
for i, (climate, values) in enumerate(data.items()):
# 计算每个气候带的箱线图的位置
position = np.arange(1, 4) + i * (4 + box_width) # 考虑箱体的宽度
positions.append(position)
# 绘制箱线图,并将箱体和外框的颜色都设置为相同颜色
boxplot = ax.boxplot([values['AS'], values['water'], values['vegetation']], positions=position, widths=box_width,
patch_artist=True)
# 设置每个箱体的样式
for i in range(len(boxplot['boxes'])):
'''
可以自行设置箱体的样式,包括颜色,线条等
facecolor:箱体内部
edgecolor:箱体外框
whiskers:延长线
caps:边缘线
set_markersize:边缘线宽度
medians:中位数线
color:颜色
linewidth:线条宽度
linestyle:线条样式
'''
color = colors[i] # 获取当前箱体对应的颜色
# 设置箱体的颜色和外框的颜色
boxplot['boxes'][i].set(facecolor=color, edgecolor=color)
# 设置箱体外边延长线的颜色
boxplot['whiskers'][i * 2].set(color=color, linewidth=1) # 下边延长线
boxplot['whiskers'][i * 2 + 1].set(color=color, linewidth=1) # 上边延长线
# 设置边缘线的颜色
boxplot['caps'][i * 2].set(color=color, linewidth=1) # 上边缘线
boxplot['caps'][i * 2 + 1].set(color=color, linewidth=1) # 下边缘线
# 设置边缘线的长度
boxplot['caps'][i * 2].set_markersize(5) # 上边缘线长度,可以根据需要调整
boxplot['caps'][i * 2 + 1].set_markersize(5) # 下边缘线长度,可以根据需要调整
# 设置中位数线的颜色
boxplot['medians'][i].set(color='black', linewidth=1) # 中位数线颜色,这里设置为黑色
# 设置异常值的样式和颜色
for flier in boxplot['fliers']:
flier.set(marker='o', markerfacecolor='red', markersize=5) # 样式为圆形,颜色为红色,大小为5
# 添加竖线以隔开箱体
ax.axvline(positions[0][-1] + 1.2, color='black', linestyle='--', linewidth=0.5, dashes=(10, 5)) # dashes为虚线的密度
ax.axvline(positions[1][-1] + 1.2, color='black', linestyle='--', linewidth=0.5, dashes=(10, 5))
# 在指定位置添加字样(可自行调节)
ax.text(positions[0][-1] + 0.8, 1, 'AS', fontsize=12, ha='center')
ax.text(positions[1][-1] + 0.7, 1, 'water', fontsize=12, ha='center')
ax.text(positions[2][-1] - 0.4, 1, 'vegetation', fontsize=12, ha='center')
# 清空x轴标签
ax.set_xticks([])
# 添加标题和y轴标签
# ax.set_title('三个气候带下28城区的AS、水、植被总体比例')
ax.set_ylabel('proportion')
# 创建自定义图例
legend_patches = [mpatches.Patch(color=color, label=climate) for climate, color in zip(data.keys(), colors)]
legend = ax.legend(handles=legend_patches, loc='upper center', bbox_to_anchor=(0.5, 0), ncol=3, frameon=False)
# 保存图片到本地
plt.savefig("分组箱线图001.png", bbox_inches='tight')
# 显示图表
plt.show()
使用说明
代码中随机创建了几组数据来绘图,数据分布范围为0到1,换个人数据使用时需要自行调节各个部分直接按的位置,包括箱体大小,位置,竖线位置,图例位置等。每行代码都有注释,可以直接修改,把自己的数据存为字典后可以直接使用。
结果展示
往期回顾
在我的公众号(同名)中会持续更新好看的SCI论文图片的代码复刻,往期图片如下,可自行在公众号中获取