我正在尝试绘制小提琴图,以在y轴上说明深度,并在x轴上说明距已知点的距离。我能够获得x轴标签,以基于可变距离在x轴上适当地分布,但是我无法获得小提琴图来对齐。他们的图似乎移到了y轴。任何帮助,将不胜感激。我的代码如下:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
path = 'O:\info1.csv'
df = pd.read_csv(path)
item = ['a', 'b', 'c', 'd', 'e', 'f']
dist = [450, 1400, 2620, 3100, 3830, 4940]
plt.rcParams.update({'font.size': 15})
fig, axes1 = plt.subplots(figsize=(20,10))
axes1 = sns.violinplot(x='item', y='surface', data=df, hue = 'item', order = (item))
axes1.invert_yaxis()
axes1.set_xlabel('Item')
axes1.set_ylabel('Depth')
axes1.set_xticks(dist)
plt.xticks(rotation=20)
plt.show()
示例数据集:
答案 0 :(得分:0)
感谢您提供一些数据。
要更改绘图,需要调整代码中的item
和dist
变量,并删除代码中的item = [a,b...]
和dist = []
数组。使用axes1.set_xticks
在x轴上的刻度线需要进行一些调整才能在此处找到所需的内容。
示例1: 删除了创建您之前看到的绘图的两个数组;小提琴功能不变。
# item = ['a', 'b', 'c', 'd', 'e', 'f'] * Removed
# dist = [450, 1400, 2620, 3100, 3830, 4940] * Removed
plt.rcParams.update({'font.size': 15})
fig, axes1 = plt.subplots(figsize=(20,10))
axes1 = sb.violinplot(x='item', y='surface', data=df, hue = 'item', inner = 'box')
axes1.invert_yaxis()
axes1.set_xlabel('Item')
axes1.set_ylabel('Depth')
#axes1.set_xticks(dist) * Removed
plt.xticks(rotation=20)
plt.show()
在每个曲线的内部,都有一个黑色的形状,里面有一个白色的点。这是上面提到的微型箱形图。如果要删除箱形图,可以在violinplot调用中设置inner = None
参数,以简化最终可视化效果的外观。
示例2:
在您的x轴上放置dist
代替xticks
。
plt.rcParams.update({'font.size': 15})
plt.subplots(figsize=(20,10))
# Put 'dist' as your x input, keep your categorical variable (hue) equal to 'item'
axes1 = sb.violinplot(data = df, x = 'dist', y = 'surface', hue = 'item', inner = 'box');
axes1.invert_yaxis()
axes1.set_xlabel('Item')
axes1.set_ylabel('Depth');
我不确定要使用的项目和距离是否要在x轴上显示关系,或者是否只想使用这些整数作为该轴的刻度线。如果item
和dist
之间存在重要关系,则可以使用字典new_dict = {450: 'a', 1400: 'b', 2620: 'c' ...
希望这对您有所帮助。
答案 1 :(得分:0)
您不能使用seaborn小提琴图,因为在小插图中:
此函数始终将变量之一视为分类和 在相关轴的偶数位置(0,1,…n)绘制数据,甚至 当数据具有数字或日期类型时。
因此,如果直接用seaborn绘制它,则是绝对的:
sns.violinplot(x='dist', y='surface', data=df, hue = 'item',dodge=False,cut=0)
要放置箱形图,您需要使用matplotlib,首先我们以所需的格式获取数据并定义一个调色板:
surface_values = list([np.array(value) for name,value in df.groupby('item')['surface']])
dist_values = df.groupby('item')['dist'].agg("mean")
pal = ["crimson","darkblue","rebeccapurple"]
您需要设置宽度,提供距离,并为内部“框”修改here中的代码:
fig, ax = plt.subplots(1, 1,figsize=(8,4))
parts = ax.violinplot(surface_values,widths=200,positions=dist_values,
showmeans=False, showmedians=False,showextrema=False)
for i,pc in enumerate(parts['bodies']):
pc.set_facecolor(pal[i])
pc.set_edgecolor('black')
pc.set_alpha(1)
quartile1, medians, quartile3 = np.percentile(surface_values, [25, 50, 75], axis=1)
whiskers = np.array([
adjacent_values(sorted_array, q1, q3)
for sorted_array, q1, q3 in zip(surface_values, quartile1, quartile3)])
whiskersMin, whiskersMax = whiskers[:, 0], whiskers[:, 1]
inds = dist_values
ax.scatter(inds, medians, marker='o', color='white', s=30, zorder=3)
ax.vlines(inds, quartile1, quartile3, color='k', linestyle='-', lw=5)
ax.vlines(inds, whiskersMin, whiskersMax, color='k', linestyle='-', lw=1)
如果您不需要内盒,只需致电plt.violin ...