【问题标题】:Add percentages to histograms in JointGrid向 JointGrid 中的直方图添加百分比
【发布时间】:2020-02-27 17:19:12
【问题描述】:

是否可以向 JointGrid 的直方图添加百分比?

我可以忍受低于、高于或高于栏的百分比。 或者用一个额外的轴显示百分比+线。 我浏览了 JointGrid 的源代码,以找到一种方法来恢复两个直方图的隐藏轴,这样我就可以向它们添加百分比。

我还为直方图轴尝试了不同的标签,但这不起作用,因为它们是共享的:

hex.ax_marg_y.set_yticklabels(["test", "label"])

这是我正在进行的工作:

labels = ['Ma 13', 'Di 14', 'Wo 15', 'Do 16', 'Vr 17', 'Za 18', 'Zo 19', 'Ma 20']

hex = sns.JointGrid(x, y, height = 12)
hex.ax_marg_x.hist(x, bins=np.arange(-0.5, 23.5))
hex.ax_marg_y.hist(y, bins=np.arange(-0.5, len(labels) + 0.5), orientation="horizontal")
hex.plot_joint(sns.kdeplot, shade=True, cmap="Blues", bw=.11)

plt.ylim(-0.5, len(labels)-0.5)
plt.xlim(-0.5, 23.5)

hex.ax_joint.set_xticks(range(24))
hex.ax_joint.set_yticks(range(len(labels)))
hex.ax_joint.set_yticklabels(labels)

plt.subplots_adjust(left=0.05, right=0.95, top=0.93, bottom=0)  # Shrink figure so the legende is visible

hex.x = x2
hex.y = y2
hex.plot_joint(plt.scatter, marker = 'x', c = 'r', s = 190)

plt.show()

Image of the JointGrid

【问题讨论】:

    标签: python python-3.x matplotlib seaborn


    【解决方案1】:

    如果您注意保存对ax_marg_{x|y}.hist() 返回的艺术家的引用,那么只需循环遍历每个艺术家并在正确的位置进行注释:

    tips = sns.load_dataset("tips")
    x = tips['total_bill']
    y = tips['tip']
    hex = sns.JointGrid(x, y)
    _,_,bars_x = hex.ax_marg_x.hist(x)
    _,_,bars_y = hex.ax_marg_y.hist(y, orientation="horizontal")
    hex.plot_joint(sns.kdeplot, shade=True, cmap="Blues")
    
    # annotate top hist
    total_height = np.sum([bar.get_height() for bar in bars_x])
    for bar in bars_x:
        height = bar.get_height()
        hex.ax_marg_x.annotate('{:.1f}%'.format(100*height/total_height),
                        xy=(bar.get_x() + bar.get_width() / 2, height),
                        xytext=(0, 1),  # 1 points vertical offset
                        textcoords="offset points",
                        ha='center', va='bottom', fontsize=8)
    
    # annotate right hist
    total_height = np.sum([bar.get_width() for bar in bars_y])
    for bar in bars_y:
        height = bar.get_width()
        hex.ax_marg_y.annotate('{:.1f}%'.format(100*height/total_height),
                        xy=(height, bar.get_y(), ),
                        xytext=(1, 10),  # 1 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center', fontsize=8)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-12
      • 2022-08-14
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多