如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?

Posted

技术标签:

【中文标题】如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?【英文标题】:How can I make a barplot and a lineplot in the same seaborn plot with different Y axes nicely? 【发布时间】:2016-10-22 04:35:42 【问题描述】:

我有两组具有共同索引的不同数据,我想在同一个图表中将第一组表示为条形图,将第二组表示为线图。我目前的方法类似于以下。

ax = pt.a.plot(alpha = .75, kind = 'bar')
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), pt.b.values, alpha = .75, color = 'r')

结果和这个差不多

这张图片真的很好,几乎是对的。我唯一的问题是ax.twinx() 似乎在前一个画布之上创建了一个新画布,并且条形图顶部的白线清晰可见。

有什么方法可以在不包括白线的情况下进行绘制?

【问题讨论】:

2 个带左/右轴的折线图的相同问题:***.com/questions/26752464/… 【参考方案1】:

您可以使用twinx() 方法与 seaborn 一起创建一个单独的 y 轴,一个用于线图,另一个用于条形图。要控制绘图的样式(seaborn 的默认样式是 darkgrid),您可以使用 set_style 方法并指定首选主题。如果您设置style=None,它将重置为没有网格线的白色背景。你也可以试试whitegrid。如果您想进一步自定义网格线,可以使用ax2.grid(False) 在轴级别上进行。

import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns

matplotlib.rc_file_defaults()
ax1 = sns.set_style(style=None, rc=None )

fig, ax1 = plt.subplots(figsize=(12,6))

sns.lineplot(data = df['y_var_1'], marker='o', sort = False, ax=ax1)
ax2 = ax1.twinx()

sns.barplot(data = df, x='x_var', y='y_var_2', alpha=0.5, ax=ax2)

【讨论】:

ax2 怎么知道它应该是 lineplot ,即使它被称为 ax2.plot()【参考方案2】:

您必须删除第二个轴的网格线。添加到代码ax2.grid(False)。但是,第二个轴的 y-ticks 不会与第一个 y-axis 的 y-ticks 对齐,如下所示:

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

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(pd.Series(np.random.uniform(0,1,size=10)), color='g')
ax2 = ax1.twinx()
ax2.plot(pd.Series(np.random.uniform(0,17,size=10)), color='r')
ax2.grid(False)
plt.show()

【讨论】:

这个情节如何使用seaborn?

以上是关于如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?的主要内容,如果未能解决你的问题,请参考以下文章

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

Seaborn/Plotly 多个 y 轴

Python Seaborn Facetgrid 更改 xlabels

Plotly Python:在具有多个 Y 轴的分组条形图中对齐 X 轴

如何使用 seaborn 创建多线图?

seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot)