首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何在不同的x点上绘制不同类型的海图?

我如何在不同的x点上绘制不同类型的海图?
EN

Stack Overflow用户
提问于 2022-02-24 20:52:02
回答 1查看 64关注 0票数 0

我希望有多种类型的海图使用相同的y轴,但有不同的x坐标(见下图)。

我尝试过用不同的方式来指定X轴坐标,但似乎无法让它正常工作。

下面是一个几乎可以工作的代码的示例

代码语言:javascript
复制
x=[1,2,3,3,3,4,4,5,5,6] # first violin
y=[4,4,5,5,5,5,6] # second violin 
z=[5,5,6] # swarmplot over second violin


for data,label in [(x,'x'),(y,'y'),(z,'z')]:
    for i in data:
        c2v['value'].append(i)
        c2v['key'].append(label)
    

data=pd.DataFrame(c2v)
data.head()

print(data.loc[data.key=='z'])
fig,ax=plt.subplots(1,figsize=(5,5),dpi=200)
ax = sns.violinplot(data=data.loc[data.key.isin(['x','y'])], x='key', y='value',palette=['honeydew','lightgreen'])
sns.swarmplot(x=['swarmplot']*len(data), y=data['value'], order=ax.get_xticklabels() + ['swarmplot'], ax=ax)               #.loc[data.key=='z',:]
ax.set_xlabel('')

它产生以下图像:

然而,它正在绘制与x/y/z相关的所有值,而不仅仅是z。当我将数据分割为成组图中的“z”时,我会得到一个错误:

代码语言:javascript
复制
sns.swarmplot(x=['swarmplot']*len(data), y=data.loc[data.key=='z',:]['value'], order=ax.get_xticklabels() + ['swarmplot'], ax=ax)               
代码语言:javascript
复制
KeyError: 'swarmplot'

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 22:12:34

要在同一个x轴上绘制第二幅图,可以使用order=提供一个现有滴答标签的列表,并附加新标签。

下面是一个示例:

代码语言:javascript
复制
import seaborn as sns

tips = sns.load_dataset('tips')
ax = sns.swarmplot(data=tips, x='day', y='total_bill')
sns.violinplot(x=['violin']*len(tips), y=tips['total_bill'], order=ax.get_xticklabels() + ['violin'], ax=ax)
ax.set_xlabel('')

新问题中的代码的问题是,成组图的x=y=需要相同数量的元素。此外,some似乎重新设置了y限制,因此我添加了一些代码来重新调整这些限制:

代码语言:javascript
复制
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

x = [1, 2, 3, 3, 3, 4, 4, 5, 5, 6]  # first violin
y = [4, 4, 5, 5, 5, 5, 6]  # second violin
z = [5, 5, 6]  # swarmplot over second violin

data = pd.DataFrame({'value': np.concatenate([x, y, z]),
                     'key': ['x'] * len(x) + ['y'] * len(y) + ['z'] * len(z)})
fig, ax = plt.subplots(1, figsize=(5, 5))
ax = sns.violinplot(data=data.loc[data.key.isin(['x', 'y'])], x='key', y='value', palette=['honeydew', 'lightgreen'])
ymin1, ymax1 = ax.get_ylim()
swarm_data = data.loc[data.key == 'z', :]['value']
sns.swarmplot(x=['swarmplot'] * len(swarm_data), y=swarm_data, order=ax.get_xticklabels() + ['swarmplot'], ax=ax)
ymin2, ymax2 = ax.get_ylim()
ax.set_ylim(min(ymin1, ymin2), max(ymax1, ymax2))
ax.set_xlabel('')
ax.set_xticks(np.arange(3))
ax.set_xticklabels(['x', 'y', 'swarmplot'])
plt.show()

您可以通过直接使用数据来简化事情,而无需创建dataframe:

代码语言:javascript
复制
x = [1, 2, 3, 3, 3, 4, 4, 5, 5, 6]  # first violin
y = [4, 4, 5, 5, 5, 5, 6]  # second violin
z = [5, 5, 6]  # swarmplot over second violin

fig, ax = plt.subplots(1, figsize=(5, 5))
ax = sns.violinplot(x=['x']*len(x) + ['y']*len(y), y=x + y, palette=['honeydew', 'lightgreen'])
ymin1, ymax1 = ax.get_ylim()
sns.swarmplot(x=['swarmplot'] * len(z), y=z, order=ax.get_xticklabels() + ['swarmplot'], ax=ax)
ymin2, ymax2 = ax.get_ylim()
ax.set_ylim(min(ymin1, ymin2), max(ymax1, ymax2))
ax.set_xticks(np.arange(3))
ax.set_xticklabels(['x', 'y', 'swarmplot'])
plt.show()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71258117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档