【问题标题】:Stacked barchart in PairGrid python seabornPairGrid python seaborn中的堆叠条形图
【发布时间】:2019-12-29 20:16:58
【问题描述】:

我希望重现 that tutorial 中的 PairGrid 图,但在本地我的条形图没有像教程中那样堆叠,我不知道如何制作它们。

import seaborn as sns
import matplotlib.pyplot as plt  # for graphics
import os
os.sys.version
# '3.6.4 (default, Sep 20 2018, 19:07:50) \n[GCC 5.4.0 20160609]'

sns.__version__    
# '0.9.0'

mpg = sns.load_dataset('mpg')

g = sns.PairGrid(data=mpg[["mpg", "horsepower", "weight", "origin"]], hue="origin")
g.map_upper(sns.regplot)
g.map_lower(sns.residplot)

# below for the histogram
g.map_diag(plt.hist)

# also I tried
# g.map_diag(lambda x, label, color: plt.hist(x, label=label, color=color, histtype='barstacked', alpha=.4))
# g.map_diag(plt.hist, histtype='barstacked')
# but same result

g.savefig('./Plots/mpg.svg')

我是否必须遵循这篇帖子的第二个答案answer 暗示与seaborn做这件事很棘手, 还是我应该按照here 的建议返回 plt 以获得更简单的图表?

无论如何,我很想知道他们是如何在tutorial linked above 中堆叠酒吧的。

【问题讨论】:

  • 本教程可能使用了更早版本的 seaborn。也可能 matplotlib 版本不同。在没有看太多细节的情况下,我怀疑this commit 是这里的关键变化。
  • 好的,但最令我惊讶的是,传递专门的参数来绘制histtype='barstacked'plt.hist 不会导致堆叠直方图。
  • 对我来说更令人惊讶的是,它实际上似乎以前有效。 IE。如果您多次拨打plt.hist,它就无法知道以前的电话。
  • 如果我用 seaborn 0.8.1 和 matplotlib 2.0.2 运行它,结果是this,它有堆叠的条形,但结果是错误的(例如从中心轴看)。
  • 找到了。它已在 this commit 中删除

标签: python matplotlib seaborn


【解决方案1】:

PairGrid 对角线上的堆叠直方图选项已从 this commit 的 seaborn 中删除,因此在 seaborn 0.9 中不再可用。

一种解决方法是先收集所有数据,然后将其绘制到相应的轴上。

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

df = sns.load_dataset('mpg')

g = sns.PairGrid(data=df[["mpg", "horsepower", "weight", "origin"]], hue="origin")
g.map_upper(sns.regplot)
g.map_lower(sns.residplot)

# below for the histograms on the diagonal
d = {}
def func(x, **kwargs):
    ax = plt.gca()

    if not ax in d.keys():
        d[ax] = {"data" : [], "color" : []}
    d[ax]["data"].append(x)
    d[ax]["color"].append(kwargs.get("color"))

g.map_diag(func)
for ax, dic in d.items():
    ax.hist(dic["data"], color=dic["color"], histtype="barstacked")

plt.show()

【讨论】:

  • 非常好。谢谢
  • 紧凑并泛化到任何数据帧。谢谢