效果图:
主要步骤:
1. 数据准备:生成随机数组
2. 数据处理:计算四分位数、中位数、均值、最大最小值
3. 图像绘制:绘制小提琴图
详细代码:着急的直接拖到最后有完整代码
步骤一:导入库包及图片存储路径并设置中文字体为宋体,西文为新罗马(没有的库包要先下好奥)
###############################################################################
# 导入库及文件
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
config = {
"font.family": 'serif',
"font.size": 12,
"mathtext.fontset": 'stix',
"font.serif": ['SimSun'],
}
rcParams.update(config)
rcParams['axes.unicode_minus']=False
步骤二:生成随机数组
###############################################################################
figpath = r'H:/00.csdn/02fig/'
# 生成随机数组
data1 = np.random.randint(5, 80, (100))
data2 = np.random.randint(30, 90, (100))
data3 = np.random.randint(10, 70, (100))
data = np.vstack((data1, data2, data3)).T # 这里是将上面三个数组合成一个
步骤三:计算四分位数、中位数、均值、最大最小值
# 计算25, 50, 75百分位数
quartile1, medians, quartile3 = np.percentile(data, [25, 50, 75], axis=0)
# 计算均值, 最小值, 最大值
data_mean = np.mean(data, 0)
data_min = np.min(data, 0)
data_max = np.max(data, 0)
x = [2, 4, 6]
步骤四:绘制琴体
###############################################################################
# 绘制图像
fig = plt.figure(figsize=(8, 8)) # 创建画布
ax = fig.add_axes([0.1, 0.6, 0.6, 0.4]) # 安排子图位置
# 绘制琴体
vp = ax.violinplot(data, x, widths=1.8,
showmeans=False, # 不展示平均值,这里都暂时设置为不显示,后面再统一设置
showmedians=False, # 不展示中位数
showextrema=False, # 不展示极值
)
# 设置琴体颜色,边框颜色及透明度
for body in vp['bodies']:
body.set_facecolor('#D43F3A')
body.set_edgecolor('black')
body.set_alpha(1)
步骤五:绘制平均值,中位数,四分位数及极值
# 绘制平均值,中位数,四分位数及极值
ax.scatter(x, data_mean, marker=(5,1), color='y', s=20, zorder=3) # 绘制平均数
ax.scatter(x, medians, marker='>', color='white', s=20, zorder=3) # 绘制中位数
ax.vlines(x, quartile1, quartile3, color='k', linestyle='-', lw=5) # 绘制四分位数
ax.vlines(x, data_min, data_max, color='k', linestyle='-', lw=1) # 绘制极值
步骤六:设置图中信息
# 设置图中信息
# xlim,ylim:设置x轴y轴显示得最大最小值
# xticks,yticks: 设置坐标轴刻度,可控制隔几个标注,本图为两个一标
# xticklabels,yticklabels:设置坐标轴刻度名称,维度要和xticks,yticks一致奥
# xlabel,ylabel:坐标轴名称
# title:图名
ax.set(xlim=(0, 8), xticks=np.arange(2, 8, 2), xticklabels=['a', 'b', 'c',], xlabel = 'x轴',
ylim=(0, 100), yticks=np.arange(0, 101, 20), yticklabels=np.arange(0, 101, 20), ylabel = 'y轴',
title='图名')
步骤七:保存图像
###############################################################################
# 输出并保存图像
plt.savefig(figpath+'009 小提琴图.png', bbox_inches = 'tight', dpi=600, format='png')
plt.show()
完整代码在这里:
###############################################################################
# 导入库及文件
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
config = {
"font.family": 'serif',
"font.size": 12,
"mathtext.fontset": 'stix',
"font.serif": ['SimSun'],
}
rcParams.update(config)
rcParams['axes.unicode_minus']=False
###############################################################################
figpath = r'H:/00.csdn/02fig/'
# 生成随机数组
data1 = np.random.randint(5, 80, (100))
data2 = np.random.randint(30, 90, (100))
data3 = np.random.randint(10, 70, (100))
data = np.vstack((data1, data2, data3)).T # 这里是将上面三个数组合成一个
# 计算25, 50, 75百分位数
quartile1, medians, quartile3 = np.percentile(data, [25, 50, 75], axis=0)
# 计算均值, 最小值, 最大值
data_mean = np.mean(data, 0)
data_min = np.min(data, 0)
data_max = np.max(data, 0)
x = [2, 4, 6]
###############################################################################
# 绘制图像
fig = plt.figure(figsize=(8, 8)) # 创建画布
ax = fig.add_axes([0.1, 0.6, 0.6, 0.4]) # 安排子图位置
# 绘制琴体
vp = ax.violinplot(data, x, widths=1.8,
showmeans=False, # 不展示平均值,这里都暂时设置为不显示,后面再统一设置
showmedians=False, # 不展示中位数
showextrema=False, # 不展示极值
)
# 设置琴体颜色,边框颜色及透明度
for body in vp['bodies']:
body.set_facecolor('#D43F3A')
body.set_edgecolor('black')
body.set_alpha(1)
# 绘制平均值,中位数,四分位数及极值
ax.scatter(x, data_mean, marker=(5,1), color='y', s=20, zorder=3) # 绘制平均数
ax.scatter(x, medians, marker='>', color='white', s=20, zorder=3) # 绘制中位数
ax.vlines(x, quartile1, quartile3, color='k', linestyle='-', lw=5) # 绘制四分位数
ax.vlines(x, data_min, data_max, color='k', linestyle='-', lw=1) # 绘制极值
# 设置图中信息
# xlim,ylim:设置x轴y轴显示得最大最小值
# xticks,yticks: 设置坐标轴刻度,可控制隔几个标注,本图为两个一标
# xticklabels,yticklabels:设置坐标轴刻度名称,维度要和xticks,yticks一致奥
# xlabel,ylabel:坐标轴名称
# title:图名
ax.set(xlim=(0, 8), xticks=np.arange(2, 8, 2), xticklabels=['a', 'b', 'c',], xlabel = 'x轴',
ylim=(0, 100), yticks=np.arange(0, 101, 20), yticklabels=np.arange(0, 101, 20), ylabel = 'y轴',
title='图名')
###############################################################################
# 输出并保存图像
plt.savefig(figpath+'009 小提琴图.png', bbox_inches = 'tight', dpi=600, format='png')
plt.show()