Python中带有上面Boxplot的直方图

Posted

技术标签:

【中文标题】Python中带有上面Boxplot的直方图【英文标题】:Histogram with Boxplot above in Python 【发布时间】:2016-01-27 15:39:51 【问题描述】:

您好,我想绘制一个直方图,在直方图顶部显示一个箱线图,显示 Q1、Q2 和 Q3 以及异常值。示例电话如下。 (我正在使用 Python 和 Pandas)

我已经检查了几个使用matplotlib.pyplot 的示例,但几乎没有找到一个好的示例。而且我还想让直方图曲线如下图所示。

我也尝试了seaborn,它为我提供了形状线和直方图,但没有找到一种方法与上面的 boxpot 合并。

任何人都可以帮助我在matplotlib.pyplot 或使用pyplot 上拥有这个

【问题讨论】:

【参考方案1】:
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(style="ticks")

x = np.random.randn(100)

f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, 
                                    gridspec_kw="height_ratios": (.15, .85))

sns.boxplot(x, ax=ax_box)
sns.distplot(x, ax=ax_hist)

ax_box.set(yticks=[])
sns.despine(ax=ax_hist)
sns.despine(ax=ax_box, left=True)

【讨论】:

谢谢!正是我正在寻找的方式。但它带来了一些问题,列之间存在间隙,我尝试使用bins 参数但没有运气。此外,我希望 y 轴具有 frequency 而不是概率。我在seaborn 文档中没有找到任何方法来做到这一点。你能帮忙吗? 这些与您的原始问题完全不同,因此您应该将它们作为两个新问题提出。 别担心伙计们。经过一段时间的搜索,我实际上找到了解决方案。感谢您的陪伴。 知道如何将上述样式的 8 个独立实例组合成一个图吗?【参考方案2】:

扩展@mwaskom 的答案,我做了一点适应性功能。

import seaborn as sns
def histogram_boxplot(data, xlabel = None, title = None, font_scale=2, figsize=(9,8), bins = None):
    """ Boxplot and histogram combined
    data: 1-d data array
    xlabel: xlabel 
    title: title
    font_scale: the scale of the font (default 2)
    figsize: size of fig (default (9,8))
    bins: number of bins (default None / auto)

    example use: histogram_boxplot(np.random.rand(100), bins = 20, title="Fancy plot")
    """

    sns.set(font_scale=font_scale)
    f2, (ax_box2, ax_hist2) = plt.subplots(2, sharex=True, gridspec_kw="height_ratios": (.15, .85), figsize=figsize)
    sns.boxplot(data, ax=ax_box2)
    sns.distplot(data, ax=ax_hist2, bins=bins) if bins else sns.distplot(data, ax=ax_hist2)
    if xlabel: ax_hist2.set(xlabel=xlabel)
    if title: ax_box2.set(title=title)
    plt.show()

histogram_boxplot(np.random.randn(100), bins = 20, title="Fancy plot", xlabel="Some values")

Image

【讨论】:

【参考方案3】:
def histogram_boxplot(feature, figsize=(15,10), bins=None):
    f,(ax_box,ax_hist)=plt.subplots(nrows=2,sharex=True, gridspec_kw='height_ratios':(.25,.75),figsize=figsize)                                  
                                                                                                   
    sns.distplot(feature,kde=False,ax=ax_hist,bins=bins) 
    sns.boxplot(feature,ax=ax_box, color='Red')
    ax_hist.axvline(np.mean(feature),color='g',linestyle='-')
    ax_hist.axvline(np.median(feature),color='y',linestyle='--')

【讨论】:

请修复您的代码格式并提供一些背景信息,说明您的解决方案优于提供的其他答案的原因。

以上是关于Python中带有上面Boxplot的直方图的主要内容,如果未能解决你的问题,请参考以下文章

geom_boxplot 作为直方图中的插图

R语言ggplot2可视化:组合箱图(boxplot)和直方图(histogram)输出组合可视化结果

箱线图boxplot

使用 ggplot2 组合箱线图和直方图

pyplot绘制常见图表

使用 ggplot2 合并和完美对齐直方图和箱线图