Matplotlib如何在X值不同的数据共享X轴?

7

我该如何修改下面的代码,使得图表跨越所有6个x轴的值,并且只在df2柱状图的A、C、F处留出空白?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'x':['A','B','C','D','E','F'],'y1':np.random.rand(6)})
df2 = pd.DataFrame({'x':['B','D','E'],'y2':np.random.rand(3)})

fig,axes = plt.subplots(2, sharex='all')

sns.barplot(x='x',y='y1',data=df,ax=axes[0])
sns.barplot(x='x',y='y2',data=df2,ax=axes[1])

enter image description here

2个回答

5

Seaborn的order参数可以接受一个列表,其中可以包含数据中不存在的值。因此,您可以提供来自x列的唯一值。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'x':['A','B','C','D','E','F'],'y1':np.random.rand(6)})
df2 = pd.DataFrame({'x':['B','D','E'],'y2':np.random.rand(3)})

order = np.unique(list(df.x)+list(df2.x))

fig,axes = plt.subplots(2, sharex='all')

sns.barplot(x='x',y='y1',data=df,ax=axes[0], order=order)
sns.barplot(x='x',y='y2',data=df2,ax=axes[1], order=order)

plt.show()

enter image description here


3
使用仅限于matplotlib的方法,可以通过结合两个数据框来完成此操作:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(2, sharex='all')

ax1, ax2 = axes

df = pd.DataFrame({'x': ['A', 'B', 'C', 'D', 'E', 'F'], 'y1': np.arange(6)})
df2 = pd.DataFrame({'x': ['B', 'D', 'E'], 'y2': np.random.rand(3)})

combined = df.merge(df2, how='left', on='x')

ax1.bar(combined['x'], combined['y1'])
ax2.bar(combined['x'], combined['y2'])

enter image description here


我尝试使用自己的数据,但仍存在问题,因为在开始时有NaN。如果您将示例中的df更改为'y1':[np.nan,np.nan] + list(np.arange(4)),则x轴上的'A'位置仍然会缺失。有什么好的解决方法吗?另一种答案对我来说最终没有起作用,因为我还需要进行线图制作。 - pyjamas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接