Построить несколько кругов с числами в них в Python с циклом (возвращается пустая фигура) - PullRequest
0 голосов
/ 30 сентября 2018

Аналогично этому вопросу, но для многих кругов с числами в них.Я не знаю почему, но генерируемая цифра получается пустой.Мне нужна фигура с 9 кружками (имеющая 1 из 3 цветов) с напечатанным в кружке "job_id".

import matplotlib.pyplot as plt
import pandas as pd

d = {'job_id': [1, 2, 3, 4, 5, 6, 7, 8, 9], 
     'hub': ['ZH1', 'ZH1', 'ZH1', 'ZH2', 'ZH2', 'ZH3', 'ZH3', 'ZH3', 'ZH3'], 
     'alerts': [18, 35, 45, 8, 22, 34, 29, 20, 30],
    'color': ['orange', 'orange', 'orange', 'green', 'green', 'lightblue', 'lightblue', 'lightblue', 'lightblue']}

df=pd.DataFrame(data=d)

ax=plt.subplot(111)
for index, row in df.iterrows():
    print(row)
    ax.text(index,row['alerts'],str(row['job_id']), transform=plt.gcf().transFigure,
         bbox={"boxstyle" : "circle", "color":row['color']})

plt.show()

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Две проблемы.

  • Преобразование установлено на преобразование фигуры.Это будет принимать цифры от 0 до 1 в обоих направлениях.Однако ваши данные располагаются намного выше 1. Поскольку кажется, что вы все равно хотите показать круги в координатах данных, удалите часть transform=....
  • Текстовые элементы нельзя использовать для автоматического масштабирования осей.Следовательно, вам необходимо установить пределы вручную.

Полный код:

import matplotlib.pyplot as plt
import pandas as pd

d = {'job_id': [1, 2, 3, 4, 5, 6, 7, 8, 9], 
     'hub': ['ZH1', 'ZH1', 'ZH1', 'ZH2', 'ZH2', 'ZH3', 'ZH3', 'ZH3', 'ZH3'], 
     'alerts': [18, 35, 45, 8, 22, 34, 29, 20, 30],
    'color': ['orange', 'orange', 'orange', 'green', 'green', 'lightblue', 'lightblue', 'lightblue', 'lightblue']}

df=pd.DataFrame(data=d)

ax=plt.subplot(111)
for index, row in df.iterrows():
    ax.text(index, row['alerts'],str(row['job_id']),
         bbox={"boxstyle" : "circle", "color":row['color']})

ax.set(xlim=(-1,len(df)), ylim=(df["alerts"].min()-5, df["alerts"].max()+5))
plt.show()

enter image description here

0 голосов
/ 30 сентября 2018

Вам необходимо отобразить координаты XY в диапазоне 0-1.Для этого я делю x и y на максимальное значение в DataFrame.Позже я соответствующим образом корректирую x- и y-ограничения и помечаю оси для отображения фактических значений.

У вас также было только два 'green', но четыре 'lightblue' в вашем словаре.Я исправил это.Я также заменил index bby row['job_id'], потому что индекс начинается с 0, но вы хотите построить круг 1 в x=1

for index, row in df.iterrows():
    ax.text(row['job_id']/max(d['job_id']),row['alerts']/max(d['alerts']),str(row['job_id']), 
            bbox={"boxstyle" : "circle", "color":row['color']})

plt.xlim(0, 1.1)    
plt.ylim(0, 1.1) 
plt.xticks(np.linspace(0,1,10), range(10))
plt.yticks(np.linspace(0,1,10), range(0,50,5))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...