Python 小提琴图(violinplot)

Python 小提琴图(violinplot)

1. 两种不同shape的数据

这个问题也不是很理解, ax.violinplot() 需要一个 dataset , 如果我们要绘制多个小提琴, 那么 dataset 应该是一个二维数据

1.1 list类型

import numpy as np
import matplotlib.pyplot as plt
import time

positions=[1,2,4,7]
data=[
    np.random.normal(1,5,100).tolist(),
    np.random.normal(20,5,100).tolist(),
    np.random.normal(30,5,100).tolist(),
    np.random.normal(40,5,100).tolist(),
]

print(len(data))

fig,ax=plt.subplots()

ax.violinplot(data,positions,showmeans=True,showmedians=True)


import os

SaveDir = 'result/'
if not os.path.exists(SaveDir):
    os.makedirs(SaveDir)
now = time.strftime("%Y_%m%d_%H%M_%S", time.localtime(
    time.time()))  # 获得当前时间 2021_1108_2310_22
SaveFile = SaveDir + 'zzz' + '_' + now + '.png'  
plt.savefig(SaveFile)
print(SaveFile +    ' ==================>>> has been complete')
plt.close()

此时 data 的每一行构成一个 violin , 合乎我们的理解

listdataf1

1.2 numpy.ndarray 类型

这个时候如果 np 数组的 shape 是 4*100, 程序是报错的,此时 violinplot 是按照 列 来读取 data 的,就会构造100个violin,而 position 只指定了 4 个 位置。当然,不指定 position 也是可以的,不过画出来的图不是预期的了。

如果 ndarray 类型 的 dataset 的 shape 是 4*100,不指定 position 参数

import numpy as np
import matplotlib.pyplot as plt

positions = [1, 2, 4, 7]

data = np.zeros((4, 100))

data[0] = np.random.normal(1, 5, 100)
data[1] = np.random.normal(20, 5, 100)
data[2] = np.random.normal(30, 5, 100)
data[3] = np.random.normal(40, 5, 100)

fig, ax = plt.subplots()

ax.violinplot(data, showmeans=True, showmedians=True)

得到

errorviolin


只能将 ndarray 类型的 dataset 的 shape 改成 100*4

ndarray violin

import numpy as np
import matplotlib.pyplot as plt
import time

positions = [1, 2, 4, 7]

data = np.zeros((100, 4))

data[:,0]=np.random.normal(1,5,100)
data[:,1]=np.random.normal(20,5,100)
data[:,2]=np.random.normal(30,5,100)
data[:,3]=np.random.normal(40,5,100)

fig, ax = plt.subplots()

ax.violinplot(data,positions, showmeans=True, showmedians=True)

2.为小提琴图添加图例

ax.violinplot() 无法直接添加图例,可以使用带颜色的 patch 来描述对应的 violin

import matplotlib.pyplot as plt
import os
import time
import numpy as np

v1=np.random.normal(1,5,100)

v2=np.random.normal(20,5,100)

v3=np.random.normal(30,5,100) 

v4=np.random.normal(40,5,100) 

fig, ax = plt.subplots() #(figsize=(12,3.5))

h12=ax.violinplot([v1,v2],positions=[1,2],showmeans=True,showmedians=True)
h3=ax.violinplot(v3,positions=[4],showmeans=True,showmedians=True)
h4=ax.violinplot(v4,positions=[7],showmeans=True,showmedians=True)


h12_color=h12['bodies'][0].get_facecolor().flatten()
h3_color=h3['bodies'][0].get_facecolor().flatten()
h4_color=h4['bodies'][0].get_facecolor().flatten()


import matplotlib.patches as mpatches
h12_patch = mpatches.Patch(color=h12_color, label='violin1 and violin2')
h3_patch = mpatches.Patch(color=h3_color, label='violin3')
h4_patch = mpatches.Patch(color=h4_color, label='violin4')


ax.legend(handles=[h12_patch,h3_patch,h4_patch],loc=4)

一个 ax.violinplot() 如果同时绘制多个 [v1, v2], 就作为整体一起处理了。

violine with legend

首先获得 violin 的颜色,然后为每个 violin 添加一个patch

h12_color=h12['bodies'][0].get_facecolor().flatten()

import matplotlib.patches as mpatches
h12_patch = mpatches.Patch(color=h12_color, label='violin1 and violin2')

3. 参考链接

matplotlib-为小提琴图制作标签

legend guide

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于使用Python的Seaborn库绘制小提琴,有一些需要注意的地方。 首先,要确保已经安装了Seaborn库。可以使用以下命令安装: ``` pip install seaborn ``` 其次,需要导入Seaborn库和Matplotlib库: ```python import seaborn as sns import matplotlib.pyplot as plt ``` 接下来,我们需要准备数据。小提琴通常用于显示数值型变量的分布情况,最常见的是显示不同类别或组之间的比较。因此,我们需要将数据按照类别或组分组。 例如,我们有一个数据集,其中包含了不同城市的温度数据。我们可以按照城市将数据分组,并将每个城市的温度数据存储在一个列表中。 ```python data = { 'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'], 'Temperature': [ [68, 73, 77, 80, 83, 87, 88, 88, 85, 80, 74, 68], [55, 60, 62, 64, 68, 72, 75, 76, 74, 70, 62, 55], [28, 32, 40, 52, 63, 72, 77, 75, 68, 56, 42, 30], [49, 53, 60, 69, 77, 83, 87, 87, 81, 71, 60, 50], [65, 68, 74, 81, 89, 97, 100, 99, 93, 83, 72, 63] ] } ``` 接下来,我们可以使用Seaborn库的violinplot函数来绘制小提琴: ```python sns.violinplot(x='City', y='Temperature', data=data) plt.show() ``` 这将会生成一个小提琴,其中x轴表示城市名称,y轴表示温度值。 然而,有时候我们可能会遇到一些小坑。比如,当我们使用Seaborn库的violinplot函数绘制小提琴时,如果数据集中有缺失值,会导致程序崩溃。因此,我们需要在绘之前先处理好数据,确保不存在缺失值。 此外,如果数据集中存在异常值,也可能会导致小提琴绘制不准确。因此,在绘制小提琴之前,我们需要对数据进行合理的处理和清洗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值