使用 matplotlib 增加饼图大小,半径参数似乎没有任何作用

问题描述 投票:0回答:2

努力把蛋糕做大。查看文档和其他地方,它说要设置半径。似乎无论我在半径中输入哪个值都不会增加。我发布了完整的代码及其生成的图像。

import matplotlib.pyplot as plt


def autopct_generator(limit):
    """Remove percent on small slices."""
    def inner_autopct(pct):
        return ('%.2f%%' % pct) if pct > limit else ''
    return inner_autopct

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs', 'Test', 'Test2', 'Test3', \
    'Test4', 'Test5', 'Test6', 'Test7', 'Test8', 'Test9', 'Test10', \
    'Test11', 'Test12', 'Test13', 'Test14'
sizes = [15, 30, 45, 10, 10, 24, 13, 18, 28, 20, 13, 15, 5, 1, 18, 10,
         10, 10]
NUM_COLORS = len(sizes)

fig1, ax1 = plt.subplots(figsize=(6, 5))

# set color theme
# https://matplotlib.org/api/pyplot_summary.html#colors-in-matplotlib
theme = plt.get_cmap('bwr')
ax1.set_color_cycle([theme(
    1. * i / NUM_COLORS) for i in range(NUM_COLORS)])

box = ax1.get_position()
ax1.set_position([box.x0, box.y0, box.width * 1.3, box.height])

_, _, autotexts = ax1.pie(
    sizes, autopct=autopct_generator(7), startangle=90, radius=1.8 * 1000)
for autotext in autotexts:
    autotext.set_weight('bold')
ax1.axis('equal')
total = sum(sizes)
plt.legend(
    loc='upper left',
    labels=['%s, %1.1f%%' % (
        l, (float(s) / total) * 100) for l, s in zip(labels, sizes)],
    prop={'size': 12},
    bbox_to_anchor=(0.0, 1),
    bbox_transform=fig1.transFigure
)
# fig1.set_size_inches(18.5, 10.5)
fig1.savefig('chart.png')

enter image description here

python python-2.7 matplotlib pie-chart
2个回答
14
投票

如果打开饼图的轴,

ax.pie(..., radius=1800, frame=True)

您会发现半径确实应用正确。

enter image description here

如果你想让坐标轴在图中显得更大,你可以使用子图参数

fig.subplots_adjust(left,bottom,right,top)

示例代码:

import matplotlib.pyplot as plt

sizes = [15, 30, 45, 10, 10, 24, 13, 18, 28, 20, 13, 15, 5, 1, 18, 10,
         10, 10]
labels = ["Frogs %s" % i for i in sizes]

fig1, ax1 = plt.subplots(figsize=(6, 5))
fig1.subplots_adjust(0.3,0,1,1)


theme = plt.get_cmap('bwr')
ax1.set_prop_cycle("color", [theme(1. * i / len(sizes)) for i in range(len(sizes))])

_, _ = ax1.pie(sizes, startangle=90)

ax1.axis('equal')

total = sum(sizes)
plt.legend(
    loc='upper left',
    labels=['%s, %1.1f%%' % (
        l, (float(s) / total) * 100) for l, s in zip(labels, sizes)],
    prop={'size': 11},
    bbox_to_anchor=(0.0, 1),
    bbox_transform=fig1.transFigure
)

plt.show()

enter image description here


0
投票

不要设置

ax1.axis('equal')
ax.pie(..., frame=True)
,给定的半径表示饼图的实际大小与轴的宽度和高度的最小值的0.8倍之间的比率。 此行为在 Matplotlib 源代码此处中定义。

self.set(frame_on=False, xticks=[], yticks=[],
    xlim=(-1.25 + center[0], 1.25 + center[0]),
    ylim=(-1.25 + center[1], 1.25 + center[1]))

因此,我们可以使用下面的代码来获取给出实际尺寸(以英寸为单位)的饼图。

import matplotlib.pyplot as plt

PIE_SIZE = 4 # inches

FIGURE_WIDTH = 6
FIGURE_HEIGHT = 4
def autopct_generator(limit):
    """Remove percent on small slices."""
    def inner_autopct(pct):
        return ('%.2f%%' % pct) if pct > limit else ''
    return inner_autopct

labels = [
    'Frogs', 'Hogs', 'Dogs', 'Logs', 'Test', 'Test2', 'Test3',
    'Test4', 'Test5', 'Test6', 'Test7', 'Test8', 'Test9', 'Test10',
    'Test11', 'Test12', 'Test13', 'Test14'
]
sizes = [
    15, 30, 45, 10, 10, 24, 13, 18, 28, 20, 13, 15, 5, 1, 18, 10, 10, 10
]
NUM_COLORS = len(sizes)
fig1, ax1 = plt.subplots(figsize=(FIGURE_WIDTH, FIGURE_HEIGHT),
    gridspec_kw={'left': .33333, 'right': 1.0, 'top': 1.0, 'bottom': 0.0})

# Get the minimum value of width and height of the axes.
box = ax1.get_position(original=True)
AXES_RADIUS = min(box.width * FIGURE_WIDTH, box.height * FIGURE_HEIGHT)

# set color theme
# https://matplotlib.org/api/pyplot_summary.html#colors-in-matplotlib
theme = plt.get_cmap('bwr')
ax1.set_prop_cycle('color', [theme(
    1. * i / NUM_COLORS) for i in range(NUM_COLORS)])

_, _, autotexts = ax1.pie(
    sizes, autopct=autopct_generator(7), startangle=90,
    radius= PIE_SIZE / (AXES_RADIUS*0.8)
)
for autotext in autotexts:
    autotext.set_weight('bold')
# ax1.axis('equal')
total = sum(sizes)
plt.legend(
    loc='upper left',
    labels=['%s, %1.1f%%' % (
        l, (float(s) / total) * 100) for l, s in zip(labels, sizes)],
    prop={'size': 12},
    bbox_to_anchor=(0.0, 1),
    bbox_transform=fig1.transFigure
)
ax1.axhline(0, color='gray', linestyle='--', linewidth=0.5)
ax1.axvline(0, color='gray', linestyle='--', linewidth=0.5)
fig1.savefig(f'chart{PIE_SIZE}.png')

图形布局

馅饼尺寸 = 2 英寸

馅饼尺寸 = 3 英寸

馅饼尺寸 = 4 英寸

© www.soinside.com 2019 - 2024. All rights reserved.