如何在水平堆积条形图中显示精确小数

2022-10-02 01:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我找到了一个在https://matplotlib.org/3.1.1/gallery/lines_bars_and_markers/horizontal_barchart_distribution.html上创建堆叠条形图的代码

问题是图表中没有显示小数点。在代码中,我发现列表中没有小数,但是如果将它们改为小数,则不会显示(请参见下面的代码)。 如果试图在ax.text(x,y,str(int(c))行中将str改为float。实际上是小数,但都是0。 非常感谢

import numpy as np
import matplotlib.pyplot as plt


category_names = ['Strongly disagree', 'Disagree','Neither agree nor   
agree', 'agree', 'Strongly agree']

results = {
    'Question 1': [(10), (14.99), (17.01), (32), (26)]
}


def survey(results, category_names):
    labels = list(results.keys())
    data = np.array(list(results.values()))
    data_cum = data.cumsum(axis=1)
    category_colors = plt.get_cmap('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
        ax.barh(labels, widths, left=starts, height=0.5,
                label=colname, color=color)
        xcenters = starts + widths / 2

        r, g, b, _ = color
        text_color = 'white' if r * g * b < 0.5 else 'darkgrey'

        for y, (x, c) in enumerate(zip(xcenters, widths)):
            ax.text(x, y, str(int(c)), ha='center', va='center',
                color=text_color)
    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1),
              loc='lower left', fontsize='small')

    return fig, ax


survey(results, category_names)

Tags: 代码textdatanamesnppltaxresultscolorcategory小数strstartswidthsagree
1条回答
网友
1楼 ·

在编写str(int(c))时,首先将数字转换为整数,从而删除小数,然后将其转换为字符串。要获得所需的输出,可以使用str(c),或者如果您希望能够更好地控制数字的格式(例如选择小数点后的位数),则将str(int(c))替换为'{:.2f}'.format(c)

category_names = ['Strongly disagree', 'Disagree','Neither agree nor agree', 'agree', 'Strongly agree']

results = {
    'Question 1': [(10), (14.99), (17.01), (32), (26)]
}


def survey(results, category_names):
    labels = list(results.keys())
    data = np.array(list(results.values()))
    data_cum = data.cumsum(axis=1)
    category_colors = plt.get_cmap('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
        ax.barh(labels, widths, left=starts, height=0.5,
                label=colname, color=color)
        xcenters = starts + widths / 2

        r, g, b, _ = color
        text_color = 'white' if r * g * b < 0.5 else 'darkgrey'

        for y, (x, c) in enumerate(zip(xcenters, widths)):
            ax.text(x, y, '{:.2f}'.format(c), ha='center', va='center',
                color=text_color)
    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1),
              loc='lower left', fontsize='small')

    return fig, ax


survey(results, category_names)