Python 数据可视化 小提琴图

Python 数据可视化 小提琴图

Python 数据可视化 小提琴图_第1张图片

# -*- coding: utf-8 -*-
"""
Created on Tue Mar  9 20:16:57 2021

@author: dujidan
"""

import matplotlib.pyplot as plt
import numpy as np


# 设置上下限
def adjacent_values(vals, q1, q3):
    upper_adjacent_value = q3 + (q3 - q1) * 1.5
    upper_adjacent_value = np.clip(upper_adjacent_value, q3, vals[-1])

    lower_adjacent_value = q1 - (q3 - q1) * 1.5
    lower_adjacent_value = np.clip(lower_adjacent_value, vals[0], q1)
    return lower_adjacent_value, upper_adjacent_value


# 设置坐标轴样式
def set_axis_style(ax, labels):
    ax.get_xaxis().set_tick_params(direction='out')
    ax.xaxis.set_ticks_position('bottom')
    ax.set_xticks(np.arange(1, len(labels) + 1))
    ax.set_xticklabels(labels)
    ax.set_xlim(0.25, len(labels) + 0.75)
    ax.set_xlabel('Sample name')
    
# =============================================================================
# 随机数据
np.random.seed(123)
data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4), sharey=True)

# 一般小提琴图
ax1.set_title('Default violin plot')
ax1.set_ylabel('Observed values')
ax1.violinplot(data)

# =============================================================================
# 自定义小提琴图
ax2.set_title('Customized violin plot')
parts = ax2.violinplot(
        data, showmeans=False, showmedians=False,  # 显示均值 中位数
        showextrema=False)  # 显示上下界(极值)

# 设置 每个图形的 颜色、边界色、透明度
for pc in parts['bodies']:
    pc.set_facecolor('#D43F3A')
    pc.set_edgecolor('black')
    pc.set_alpha(1)

# 4 分位数
quartile1, medians, quartile3 = np.percentile(data, [25, 50, 75], axis=1)
whiskers = np.array([
    adjacent_values(sorted_array, q1, q3)
    for sorted_array, q1, q3 in zip(data, quartile1, quartile3)])

whiskersMin, whiskersMax = whiskers[:, 0], whiskers[:, 1]

inds = np.arange(1, len(medians) + 1)
# 画中心点
ax2.scatter(inds, medians, marker='o', color='white', s=30, zorder=3)
# 设置线性
ax2.vlines(inds, quartile1, quartile3, color='k', linestyle='-', lw=5)
ax2.vlines(inds, whiskersMin, whiskersMax, color='k', linestyle='-', lw=1)

# 设置坐标轴
labels = ['A', 'B', 'C', 'D']
for ax in [ax1, ax2]:
    set_axis_style(ax, labels)

# 调整 位置
plt.subplots_adjust(bottom=0.15, wspace=0.05)
plt.show()

你可能感兴趣的:(画图,Python)