seaborn画小提琴图简单,但缺乏自定义能力,画出来的图实在是不好看

matplotlib默认小提琴图不符合论文规范,官网提供了符合规范的图的画法,可调整性好

但是代码实在是有装逼犯的嫌疑,难懂难用难调整

我好不容易调好代码,3天之后就忘了那坨代码具体干了啥,需求一变,重新开始。。。

所以我干脆按官网的原理做了个简化版,把奇奇怪怪没必要的操作全换了,调起来舒心很多,还封装了一个函数,方便调用

(代码在文末)

用了循环,不可避免牺牲一点效率,但只要不是同时画几百张图,这点差别感觉不出来

每个步骤干了啥都写在注释里了

顺便用官网的例子画个图,左边用我的函数画的,右边是官网代码画的

看不出差别吧,反正我看不出。。。。

下面是我的函数和官网代码,复制这段代码跑一下,就可以得到上面那张图

import pandas as pd
import numpy as np
import matplotlib as mpl
#允许中文
mpl.rcParams['font.sans-serif']= ['SimHei']
#允许负号
mpl.rcParams['axes.unicode_minus'] = False
import matplotlib.pyplot as plt###################################这一段是我的函数################################def cal_box_whisker_scale(value_se):# 中位,四分位数计算quartile1,median,quartile3 = np.percentile(value_se,[25, 50, 75], axis=0)# whisker的最大值计算:“75分位数+1.5*四分位间距”whiskerMax = quartile3 + (quartile3 - quartile1) * 1.5# np.clip教程参见 https://blog.csdn.net/qq1483661204/article/details/78150203# 如果whisker的最大值>数据最大值,则设为最大值,若<75分位,设为75分位whiskerMax = np.clip(whiskerMax, quartile3, value_se.max())# whisker的最小值计算:“25分位数-1.5*四分位间距”whiskerMin = quartile1 - (quartile3 - quartile1) * 1.5# 如果whisker的最小值<数据最小值,则设为最小值,若>25分位,设为25分位whiskerMin = np.clip(whiskerMin, value_se.min(), quartile1)# 返回whisker最小值,25分位,中位,75分位,whisker最大值return whiskerMin, quartile1, median, quartile3, whiskerMax'''
参数依次是: 数据dataframe, 用于分组的列的列名,
要画在图上的组的列表(列表顺序即绘图顺序), 绘图值列的列名(纵坐标), 绘图轴
'''
def my_violin_plot(data_df, group_col, group_list, value_col, ax):for abscissa,g in enumerate(group_list):# 提取该组的数据, 注意, 这里的g必须是字符, 若是整数, 请去掉'{g}'两端的引号data_se = data_df.query(f"{group_col}=='{g}'")[value_col]# 画小提琴,不使用自带的中位数和须parts = ax.violinplot(data_se, [abscissa], showmeans=False, showmedians=False,showextrema=False)#虽然里面就一个形状, 但是返回的是包含形状对象的字典, 还是得提取出来pc=parts['bodies'][0]# 设置形状填充色pc.set_facecolor('#D43F3A')# 设置边框色pc.set_edgecolor('black')# 设置透明度pc.set_alpha(1)# 使用前面定义的函数计算whisker的最小值,25分位,中位,75分位,whisker最大值whiskerMin,quartile1,medians,quartile3,whiskerMax = cal_box_whisker_scale(data_se)# 描中位数点ax.scatter(abscissa, medians, marker='o', color='white', s=30, zorder=3)# 画箱体ax.vlines(abscissa, quartile1, quartile3, color='k', linestyle='-', lw=5)# 画whiskerax.vlines(abscissa, whiskerMin, whiskerMax, color='k', linestyle='-', lw=1)##############################下面的是官网代码###################################def adjacent_values(vals, q1, q3):upper_adjacent_value = q3 + (q3 - q1) * 1.5upper_adjacent_value = np.clip(upper_adjacent_value, q3, vals[-1])lower_adjacent_value = q1 - (q3 - q1) * 1.5lower_adjacent_value = np.clip(lower_adjacent_value, vals[0], q1)return lower_adjacent_value, upper_adjacent_valuedef set_axis_style(ax, labels):ax.xaxis.set_tick_params(direction='out')ax.xaxis.set_ticks_position('bottom')ax.set_xlabel('Sample name')# create test data
np.random.seed(19680801)
data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]
dataDf = pd.DataFrame([(str(n+1),d) for n,dat in enumerate(data) for d in dat], columns=['横坐标','纵轴值'])fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4), sharey=True)ax1.set_title('我的函数')
ax1.set_ylabel('Observed values')
my_violin_plot(dataDf, '横坐标', [1,2,3,4], '纵轴值', ax1)ax2.set_title('官网方法')
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)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)])
whiskers_min, whiskers_max = 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, whiskers_min, whiskers_max, color='k', linestyle='-', lw=1)# set style for the axes
labels = ['A', 'B', 'C', 'D']
for ax in [ax1, ax2]:set_axis_style(ax, labels)
ax1.set_xlim(-0.75, len(labels) - 0.25)
ax1.set_xticks(np.arange(0, len(labels)), labels=labels)
ax2.set_xlim(0.25, len(labels) + 0.75)
ax2.set_xticks(np.arange(1, len(labels) + 1), labels=labels)plt.subplots_adjust(bottom=0.15, wspace=0.05)
plt.savefig(r'C:\Users\WIN10\Desktop\1.png', dpi=300)
plt.show()

matplotlib绘制小提琴图(官网简化版)相关推荐

  1. Python matplotlib绘制雷达图

    Python matplotlib绘制雷达图 本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指 ...

  2. python绘制小提琴图_matplotlib 小提琴图(violin plot)

    小提琴图 (Violin Plot) 用于显示数据分布及其概率密度. 这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状.中间白点为中位数,中间的黑色粗条表示四分位数范围.上下贯穿小提琴图 ...

  3. python制作雷达图_如何利用Python matplotlib绘制雷达图

    本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多. 一. ...

  4. python怎么绘制小提琴图?|seaborn violinplot

    小提琴图 小提琴图显示了一个(或多个)变量在不同层次上的分布,这样就可以比较这些分布.小提琴图不同于箱式图,箱式图中所有的图成分对应于实际的数据点,小提琴图的特征是分布的核密度估计.我个人感觉小提琴图 ...

  5. python绘制折线图保存_Python利用matplotlib绘制折线图的新手教程

    前言 matplotlib是Python中的一个第三方库.主要用于开发2D图表,以渐进式.交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力. 一.安装matplotlib pip i ...

  6. Matplotlib绘制象限图——支持中文、箭头、自定义轴线交点

    Matplotlib绘制象限图--支持中文.箭头.自定义轴线交点 1. 效果图 2. 原理 2.1 绘制象限图步骤 2.1 添加文字到图表 3. 源码 参考 这篇博客将介绍如何使用matplotlib ...

  7. Python使用matplotlib可视化小提琴图、seaborn中的violinplot函数可视化多分类变量的小提琴图(Violin Plot)

    Python使用matplotlib可视化小提琴图.seaborn中的violinplot函数可视化多分类变量的小提琴图(Violin Plot) 目录

  8. R语言使用ggplot2包使用geom_violin函数绘制小提琴图(水平小提琴图、垂直小提琴图、边缘不截断小提琴图)实战

    R语言使用ggplot2包使用geom_violin函数绘制小提琴图(水平小提琴图.垂直小提琴图.边缘不截断小提琴图)实战 目录

  9. 超详细的Python matplotlib 绘制动态图

    复习回顾 在matplotlib模块中我们前面学习绘制如折线.柱状.散点.直方图等静态图形.我们都知道在matplotlib模块主要有三层脚本层为用户提供快捷的绘制图形方法,美工层接收到脚本层的命令后 ...

最新文章

  1. Spring AOP + Redis解决重复提交的问题
  2. 右键菜单添加程序,指定图标, Notepad2、Sublime Text 2
  3. SQL Server select语句执行顺序
  4. spring mvc项目中利用freemarker生成自定义标签
  5. 线程池传递对象参数_一次线程池参数错误引起的线上故障
  6. Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限
  7. Mac MacBook Pro的移动硬盘方案
  8. opcache开启和关闭
  9. linux学到了什么技术,Linux到底学什么?如何学?
  10. Android | Sqlite3
  11. Seata多微服务互相调用_全局分布式事物使用案例_Account-Module 账户微服务说明---微服务升级_SpringCloud Alibaba工作笔记0064
  12. 开奖啦!CSDN 程序员节 1024 中奖名单揭晓!
  13. github private链接访问_如何判定一段内存地址是不可访问的?
  14. Linux 错误: $'\r': command not found错误解决
  15. 热感传导不能证明经络的存在
  16. 中国地区城市php,中国城市列表
  17. 深度学习论文: Compounding the Performance Improvements of Assembled Techniques in a CNN及其PyTorch实现
  18. html标签选择器只认最后一个,选择某类的最后一个元素——CSS3伪类选择器走过的坑...
  19. 全国城镇地理数据拼音、文字对照 JSON
  20. 二手华为p40手机现在多少钱

热门文章

  1. python汉诺塔游戏_python求解汉诺塔游戏
  2. 暑假训练pwn(七) pwnable mistake
  3. Day06-元组字典集合%冒泡排序、选择排序
  4. IDEA 中用 Struts2 框架实现注册登录校验器
  5. 想入行的朋友看看这篇文章就大概知道游戏行业了
  6. metersphere后置脚本使用+python
  7. 读《如何在繁重的工作中持续成长?》有感
  8. Android主题更换换肤
  9. HTML入门 超详细
  10. 企业成功认定国家专精特新的申报条件