如何在不同Y轴的相同seaborn图中制作条形图和线图?

时间:2016-06-20 19:50:26

标签: python pandas matplotlib visualization seaborn

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

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()似乎在前一个画布的顶部创建了一个新画布,并且在条形图的顶部清晰地看到了白线。

有没有办法在不包括白线的情况下绘制它?

2 个答案:

答案 0 :(得分:1)

您必须删除第二轴的网格线。添加到代码ax2.grid(False)。但是,第二轴的y-ticks将不会与第一个y轴的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()

enter image description here

答案 1 :(得分: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)

A barplot and lineplot seaborn example sharing the same x-axis and different y-axis