以水平条形图展示离散分布

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何使用水平堆叠条形图来可视化离散分布。我们将使用 Matplotlib(Python 中一个流行的绘图库)来创建一个调查结果可视化。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

首先,我们将导入必要的库。在本实验中,我们将使用 Matplotlib 和 Numpy。

import matplotlib.pyplot as plt
import numpy as np

准备数据

我们需要定义类别和调查结果。在这个例子中,我们有一项调查,人们在一个五级量表上对问题的同意程度进行评分。我们将把类别定义为 category_names,把调查结果定义为 results

category_names = ['Strongly disagree', 'Disagree',
                  'Neither agree nor disagree', 'Agree', 'Strongly agree']
results = {
    'Question 1': [10, 15, 17, 32, 26],
    'Question 2': [26, 22, 29, 10, 13],
    'Question 3': [35, 37, 7, 2, 19],
    'Question 4': [32, 11, 9, 15, 33],
    'Question 5': [21, 29, 5, 5, 40],
    'Question 6': [8, 19, 5, 30, 38]
}

定义函数

现在,我们将定义一个名为 survey 的函数,它接受 resultscategory_names 作为参数,并创建一个水平堆叠条形图可视化。

def survey(results, category_names):
    """
    参数
    ----------
    results : dict
        从问题标签到每个类别的答案列表的映射。
        假设所有列表包含相同数量的条目,并且与 *category_names* 的长度匹配。
    category_names : list of str
        类别标签。
    """
    ## 将结果和类别转换为 numpy 数组
    labels = list(results.keys())
    data = np.array(list(results.values()))

    ## 计算数据的累积和以进行水平堆叠
    data_cum = data.cumsum(axis=1)

    ## 定义类别颜色
    category_colors = plt.colormaps['RdYlGn'](
        np.linspace(0.15, 0.85, data.shape[1]))

    ## 创建绘图并设置轴属性
    fig, ax = plt.subplots(figsize=(9.2, 5))
    ax.invert_yaxis()
    ax.xaxis.set_visible(False)
    ax.set_xlim(0, np.sum(data, axis=1).max())

    ## 创建堆叠条形图并添加条形标签
    for i, (colname, color) in enumerate(zip(category_names, category_colors)):
        widths = data[:, i]
        starts = data_cum[:, i] - widths
        rects = ax.barh(labels, widths, left=starts, height=0.5,
                        label=colname, color=color)
        r, g, b, _ = color
        text_color = 'white' if r * g * b < 0.5 else 'darkgrey'
        ax.bar_label(rects, label_type='center', color=text_color)

    ## 添加图例
    ax.legend(ncols=len(category_names), bbox_to_anchor=(0, 1),
              loc='lower left', fontsize='small')

    return fig, ax

调用函数并显示结果

最后,我们将以 resultscategory_names 作为输入调用 survey 函数,并显示生成的可视化结果。

survey(results, category_names)
plt.show()

总结

在本实验中,我们学习了如何使用 Matplotlib 创建水平堆叠条形图来可视化离散分布。我们定义了类别和调查结果,创建了一个函数来生成图表,并展示了结果。这种技术对于可视化调查结果或其他类型的离散分布可能很有用。