#python-3.x #pandas #matplotlib #jupyter-notebook #pie-chart
#python-3.x #панды #matplotlib #юпитер-записная книжка #круговая диаграмма
Вопрос:
У меня возникают трудности с установлением равного расстояния между круговыми диаграммами разных размеров. 5 правильно расположены в один ряд, но расстояние между контурами соседних пирожков не равно. Я перепробовал множество сокращений следующего кода, и все они не имели большого значения в выводе (см. Изображение).:
#код:
import matplotlib.pyplot as plt import pandas as pd labels = 'Verkehr', 'Maschinen und Motoren', 'Feuerungen', 'Industrie / Gewerbe', 'Land- und Forstwirtschaft' sizesax1 = [108295, 10107, 7220, 11551, 7220] sizesax2 = [77882, 6676, 6676, 13351, 6676] sizesax3 = [55652, 4417, 6184, 15900, 6184] sizesax4 = [36327, 2642, 4632, 16512, 5944] sizesax5 = [18781, 1409, 3287, 1878, 4695] fig, (ax1, ax2, ax3, ax4, ax5) = plt.subplots(1, 5, figsize =(20,4)) ax1.pie(sizesax1, startangle=0, colors = ('red', 'darkblue', 'orange', 'yellow', 'green'), radius=1*4) ax2.pie(sizesax2, startangle=0, colors = ('red', 'darkblue', 'orange', 'yellow', 'green'), radius=.77*4) ax3.pie(sizesax3, startangle=0, colors = ('red', 'darkblue', 'orange', 'yellow', 'green'), radius=.61*4) ax4.pie(sizesax4, startangle=0, colors = ('red', 'darkblue', 'orange', 'yellow', 'green'), radius=.46*4) ax5.pie(sizesax5, startangle=0, colors = ('red', 'darkblue', 'orange', 'yellow', 'green'), radius=.33*4)
некоторые дополнения, которые я пробовал:
fig.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=1, hspace=None)
или
fig.tight_layout() #giving me this error message: /srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:17: UserWarning: Tight layout not applied. The bottom and top margins cannot be made large enough to accommodate all axes decorations.
и некоторые другие.
Большое спасибо вам уже за то, что прочитали это! Я полный новичок в python и только что сумел продвинуться так далеко, как вы видите на этом изображении:
Комментарии:
1. Это немного плохо определено. Вы хотите, чтобы пробелы были одинаковыми между пирогами, или вы хотите, чтобы центры находились на одинаковом расстоянии друг от друга? Кроме того, насколько точными должны быть радиусы?
Ответ №1:
Непонятно, для чего это требуется. Я предположу, что это следующее изображение:
По сути, проблема заключается в том, что для пирога требуется квадратное соотношение сторон, которое не обеспечивается рядом подзаголовков.
Самое простое решение-создать только один участок и построить там несколько пирогов с разными центрами. Что-то вроде:
import matplotlib.pyplot as plt sizes = [ [108295, 10107, 7220, 11551, 7220], [77882, 6676, 6676, 13351, 6676], [55652, 4417, 6184, 15900, 6184], [36327, 2642, 4632, 16512, 5944], [18781, 1409, 3287, 1878, 4695]] colors = ('red', 'darkblue', 'orange', 'yellow', 'green') R = 4 radius = [R*i for i in [1.0, 0.77, 0.61, 0.46, 0.33] ] wid = sum(radius)*2 hei = R*2 fig, ax = plt.subplots(figsize =(wid,hei)) fig.subplots_adjust(left = 0, right = 1, bottom = 0, top = 1) y = R x = 0 for i in range(5): x = radius[i] ax.pie(sizes[i], startangle = 0, colors = colors, radius = radius[i], center = (x,y) ) x = radius[i] ax.set(xlim =(0,x), ylim=(0,R*2)) plt.savefig("aaa.png")
Обратите внимание, что соотношение сторон моей фигуры не соответствует (20,4) вопросу, что не соответствует тому, как я интерпретировал предполагаемый результат.
Но может случиться так, что возникнет необходимость в том, чтобы они располагались по разным осям. Если это так, то идея состоит в том, чтобы:
- Используйте gridspec для создания одной строки с 5 столбцами и укажите соотношения, чтобы они соответствовали требуемому радиусу.
- Нарисуйте больший круг в левом слоте.
- Во всех остальных слотах используйте подсетку, разделяющуюся на столбец из трех (под)слотов.
- Установите соотношения высот так, чтобы среднее из них заканчивалось соотношением сторон квадрата.
- Расположите пироги в средних пазах.
Вот и мы:
import matplotlib.pyplot as plt sizes = [ [108295, 10107, 7220, 11551, 7220], [77882, 6676, 6676, 13351, 6676], [55652, 4417, 6184, 15900, 6184], [36327, 2642, 4632, 16512, 5944], [18781, 1409, 3287, 1878, 4695]] colors = ('red', 'darkblue', 'orange', 'yellow', 'green') R = 4 radius = [R*i for i in [1.0, 0.77, 0.61, 0.46, 0.33] ] wid = sum(radius)*2 hei = R*2 ratios = [i/radius[0] for i in radius] # for gridspec fig = plt.figure(figsize =(wid,hei)) gs = fig.add_gridspec(1, 5, width_ratios = ratios, wspace=0, left = 0, right = 1, bottom = 0, top = 1) ax = fig.add_subplot(gs[0,0]) ax.pie(sizes[0], startangle = 0, colors = colors, radius = 1 ) ax.set(xlim=(-1,1) ,ylim=(-1,1)) for i in range(1,5): mid = ratios[i]/sum(ratios)*wid inrat = [(hei-mid)/2, mid, (hei-mid)/2] ings = gs[0,i].subgridspec(3, 1, hspace=0, height_ratios = inrat) ax = fig.add_subplot(ings[1,0]) ax.pie(sizes[i], startangle = 0, colors = colors, radius = 1 ) ax.set(xlim=(-1,1), ylim=(-1,1)) plt.savefig("aaa.png")