【发布时间】:2019-01-23 17:20:31
【问题描述】:
考虑以下 pandas DataFrame:
labels values_a values_b values_x values_y
0 date1 1 3 150 170
1 date2 2 6 200 180
使用 Seaborn 很容易绘制此图(请参见下面的示例代码)。然而,由于 values_a/values_b 和 values_x/values_y 之间的巨大差异,values_a 和 values_b 的条形图不容易看到(实际上,上面给出的数据集只是一个示例,在我的真实数据集中差异更大)。因此,我想使用两个 y 轴,即一个 y 轴用于 values_a/values_b,一个用于 values_x/values_y。我尝试使用 plt.twinx() 来获得第二个轴,但不幸的是,该图仅显示 values_x 和 values_y 的两个条形,即使至少有两个 y 轴具有正确的缩放比例。 :) 你知道如何解决这个问题并为每个标签获取四个条,而 values_a/values_b 条与左侧 y 轴相关,而 values_x/values_y 条与右侧 y 轴相关?
提前致谢!
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
columns = ["labels", "values_a", "values_b", "values_x", "values_y"]
test_data = pd.DataFrame.from_records([("date1", 1, 3, 150, 170),\
("date2", 2, 6, 200, 180)],\
columns=columns)
# working example but with unreadable values_a and values_b
test_data_melted = pd.melt(test_data, id_vars=columns[0],\
var_name="source", value_name="value_numbers")
g = sns.barplot(x=columns[0], y="value_numbers", hue="source",\
data=test_data_melted)
plt.show()
# values_a and values_b are not displayed
values1_melted = pd.melt(test_data, id_vars=columns[0],\
value_vars=["values_a", "values_b"],\
var_name="source1", value_name="value_numbers1")
values2_melted = pd.melt(test_data, id_vars=columns[0],\
value_vars=["values_x", "values_y"],\
var_name="source2", value_name="value_numbers2")
g1 = sns.barplot(x=columns[0], y="value_numbers1", hue="source1",\
data=values1_melted)
ax2 = plt.twinx()
g2 = sns.barplot(x=columns[0], y="value_numbers2", hue="source2",\
data=values2_melted, ax=ax2)
plt.show()
【问题讨论】:
-
尝试了该解决方案,但它对我不起作用,所以我认为它对于 barplots 是不同的。
标签: python-3.x pandas matplotlib seaborn