带有 twinx 的条形图和每月两个条形图

Barplot with twinx and two bars per month

给定的 df,其中索引是月份两列 'Ta' 和 'G_Bn'。

应使用 seaborn 根据月份绘制这些列,以获得具有两个 y 轴的条形图。一份用于 'Ta',一份用于 'G_Bn'。酒吧必须彼此相邻。我的想法:

#Create combo chart
fig, ax1 = plt.subplots(figsize=(20,10))
ax1 = sns.barplot(data=dataMonthly, color ='#2b83ba')
ax1.tick_params(axis='y')
ax1.set_xlabel('Time')
ax1.set_ylabel('Value1')

ax2 = ax1.twinx()
ax2 = sns.barplot(x = dataMonthly.index, y = "Ta", data=dataMonthly, color ="#404040")
ax2.set_ylabel('Value2')
ax2.tick_params(axis='y')
plt.show()

问题是条形图总是相互重叠,因为我在 ax1 上绘制,然后在 ax2 上绘制。我该如何解决?有什么想法吗?

以下方法创建一个虚拟分类变量作为 hue:

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

dataMonthly = pd.DataFrame({'G_Bn': np.random.uniform(30, 40, 5).cumsum(),
                            'Ta': np.random.uniform(5, 10, 5).cumsum()})

fig, ax1 = plt.subplots(figsize=(20, 10))
ax2 = ax1.twinx()

palette = ['#2b83ba', "#404040"]
categories = ["G_Bn", "Ta"]
for ax, cat_val in zip([ax1, ax2], categories):
    sns.barplot(x=dataMonthly.index, y=dataMonthly[cat_val],
                hue=pd.Categorical([cat_val] * len(dataMonthly), categories), palette=palette, ax=ax)

ax1.set_xlabel('Time')
ax2.legend_.remove()  # a legend was created for ax1 as well as ax2
plt.tight_layout()
plt.show()

PS:注意如果在调用seaborn函数之前创建了ax,强烈建议使用ax=...参数,不要捕获return-value seaborn的功能。