Matplotlib sharex 上具有不同 x 值的数据?

Posted

技术标签:

【中文标题】Matplotlib sharex 上具有不同 x 值的数据?【英文标题】:Matplotlib sharex on data with different x values? 【发布时间】:2019-09-02 15:59:45 【问题描述】:

如何修改下面的代码,使绘图跨越所有 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])

【问题讨论】:

【参考方案1】:

单独使用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'])

【讨论】:

我用自己的数据尝试了这个,但仍然有问题,因为有 NaN 是开始。如果您将示例中的 df 更改为 'y1': [np.nan, np.nan]+list(np.arange(4)),那么 x 轴上的“A”位置仍然会丢失。有什么办法可以补救吗?另一个答案最终对我不起作用,因为我也需要做线图【参考方案2】:

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()

【讨论】:

以上是关于Matplotlib sharex 上具有不同 x 值的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Python的 matplotlib画图,怎么把子图的每个横坐标显示出来?

如何使用Figure(matplotlib FigureCanvasQTAgg)绘制具有多个y轴的共享x轴子图?

使用共享 x 轴合并 matplotlib 子图

当sharex时,在pandas图中可以看到ticklabels

text ShareX代码在服务器上上传裁剪的图像

如何使用matplotlib创建具有连续轴的图形?