如何在同一图中使用不同的Y轴绘制柱状图和折线图?

16
我有两组不同的数据,它们有一个共同的索引。我想在同一张图中,用条形图表示第一组数据,用折线图表示第二组数据。我的当前方法类似于以下示例。
ax = pt.a.plot(alpha = .75, kind = 'bar')
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), pt.b.values, alpha = .75, color = 'r')

结果与此类似

A barplot and lineplot of the same data

这张图片真的很漂亮,几乎是正确的。我唯一的问题是ax.twinx()似乎在之前的画布上创建了一个新的画布,白线清晰地显示在条形图的上方。
有没有办法在绘制时不包括这些白线呢?

同样的问题适用于左/右轴的两条线图: https://dev59.com/SV8d5IYBdhLWcg3wgiX4#29099515 - benten
2个回答

22

您可以使用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)

一个使用seaborn绘制的柱形图和线图示例,共享x轴,但y轴不同


ax2 如何知道它应该是一条线图,即使它被称为 ax2.plot() - kommradHomer

2

您需要移除第二个坐标轴的网格线。请在代码中添加 ax2.grid(False)。但是第二个坐标轴的y刻度线将不会与第一个y轴的刻度线对齐,就像这样:

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

enter image description here


20
这个图中如何使用seaborn? - Roman Luštrik

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