создать коробки на графике в Python - PullRequest
1 голос
/ 30 апреля 2019

Я хочу такой результат . Я хочу, чтобы мой код читал элементы текстового файла, и если element=='healthy' он должен создать прямоугольник на графике, а его цвет должен быть зеленым («здоровый текст написан на коробке»). иначе если element=='unhealthy' это должно создать коробку, и ее цвет должен быть красным (с «нездоровым написано в коробке»). поля должны быть выровнены по горизонтали, и если их больше 5, остальные должны начинаться со следующего ряда. (каждая строка должна содержать только 5 ящиков или меньше). Конечный результат должен отображать график, который содержит поля, красный обозначает «нездоровый», а зеленый обозначает «здоровый»

Я нашел следующий код, но он не работает так, как я хочу.

import matplotlib.pyplot as plt



plt.style.use('seaborn-white')
import numpy as np
from matplotlib import colors


#open text file (percen) that contains healthy/unhealthy
with open('percen.txt', 'r') as f:   
    result= [int(line) for line in f]


data = np.random.rand(10,10) * 20

cmap = colors.ListedColormap(['green'])

cmap1 = colors.ListedColormap(['red'])

bounds = [0,10,20]
norm = colors.BoundaryNorm(bounds, cmap.N)

fig, ax = plt.subplots(2,5 , sharex='col', sharey='row')


for i in range(2):

    for j in range(5):
        for element in result:
            if (element=='healthy'):
                ax[i,j].text(1, -3, 'healthy',
                  fontsize=15, ha='center', color='green')
                ax[i,j].imshow(data,cmap=cmap, norm=norm)
            else:
                ax[i,j].text(1, -3, 'unhealthy',
                 fontsize=15, ha='center', color='red')
                ax[i,j].imshow(data,cmap=cmap1,norm=norm)

fig
plt.show()

1 Ответ

1 голос
/ 30 апреля 2019

Есть несколько разных способов сделать это, и ваш код, вероятно, не самый лучший, но мы можем использовать его в качестве отправной точки. Ваша проблема в том, что вы циклически просматриваете графики, а затем снова просматриваете данные для каждого графика. Ваш текущий код также добавляет текст над графиком. Если вы хотите текст выше, я бы порекомендовал добавить метку в качестве заголовка, в противном случае, когда вы устанавливаете свой текст внутри графика, вам нужно указать координаты в сетке.

Ниже приведена измененная форма вашего кода, попробуйте поиграть с ней еще немного, чтобы получить то, что вы хотите.

import matplotlib.pyplot as plt

plt.style.use('seaborn-white')
import numpy as np
from matplotlib import colors


result = ['healthy', 'unhealthy', 'healthy', 'unhealthy', 'healthy', 'unhealthy', 'healthy', 'healthy', 'unhealthy', 'unhealthy']

data = np.random.rand(10,10) * 20

cmap = colors.ListedColormap(['green'])

cmap1 = colors.ListedColormap(['red'])

bounds = [0,10,20]
norm = colors.BoundaryNorm(bounds, cmap.N)

fig, ax = plt.subplots(2,5 , sharex='col', sharey='row',figsize=(15,8)) # Added figsize to better show your plot



element_index = 0
for i in range(2):

    for j in range(5):
        element = result[element_index] #Instead of the for loop, get the corresponding element

        if (element=='healthy'):
            ax[i,j].text(4.5,4.5, 'healthy',fontsize=15, ha='center' ,color='black',zorder=100) #Change zorder so label is over plot
            ax[i,j].imshow(data,cmap=cmap, norm=norm)
            ax[i,j].set_yticklabels('') #To remove arbitrary numbers on y axis
            ax[i,j].set_xticklabels('') #To remove arbitrary numbers on y axis


        elif element == 'unhealthy':
            ax[i,j].text(4.5,4.5, 'unhealthy',fontsize=15, ha='center' ,color='black',zorder=100)
            ax[i,j].imshow(data,cmap=cmap1,norm=norm)
            ax[i,j].set_yticklabels('') #To remove arbitrary numbers on y axis
            ax[i,j].set_xticklabels('') #To remove arbitrary numbers on x axis



        element_index+=1       #Add 1 to the index so we get the next value for the next plot

fig
plt.show()

enter image description here

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