Цветовая диаграмма в зависимости от значения - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь раскрасить каждую полосу на основе значения, как объяснено здесь

Я попробовал простой код, и он заработал:

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])
mask1 = df.Value < 90
mask2 = df.Value >= 90
bar=plt.bar( df.index[mask1],df.Value[mask1], color='red')
bar=plt.bar( df.index[mask2],df.Value[mask2], color='blue')
plt.hlines(90,0,7);

enter image description here

Проблема в том, что при применении к моему набору данных порядок столбцов изменяется. Исходные данные:
. %REALIZADAS MÊS JANEIRO 96 FEVEREIRO 86 MARÇO 94 ABRIL 96 MAIO 85 JUNHO 92 JULHO 96 AGOSTO 92 SETEMBRO 94 OUTOBRO 94 NOVEMBRO 97 DEZEMBRO 94

И я построил их, используя
plt.bar(coleta.index, coleta['%REALIZADAS']) plt.xticks(rotation=90)
, результаты на этом графике:

enter image description here

И я попробовал этот код:

mask1= coleta["%REALIZADAS"]>=90
mask2= coleta["%REALIZADAS"]<90
bar=plt.bar(coleta.index[mask1], coleta['%REALIZADAS'][mask1],    color="blue")
bar=plt.bar(coleta.index[mask2], coleta['%REALIZADAS'][mask2],    color="red")
plt.xticks(rotation=90)
plt.hlines(90, 0,11, color='black')

Но привел в этой таблице:

enter image description here

Какя могу сохранить порядок столбцов?

1 Ответ

1 голос
/ 07 ноября 2019

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

import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])
df.index = ["a{}".format(i) for i in range(len(df))]  #<--- my fault!

mask1 = df.Value < 90
mask2 = df.Value >= 90

bar=plt.bar( df.index[mask1],df.Value[mask1], color='red')
bar=plt.bar( df.index[mask2],df.Value[mask2], color='blue')
plt.hlines(90,0,7)

Одним из возможных решений может быть следующее:

import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline

df=pd.DataFrame([95,94,99,90,89,91,92,85], columns=["Value"])

df["colors"] = "red"
df["colors"].mask(df.Value >= 90, "blue", inplace=True)

plt.bar([i for i in range(len(df))], df["Value"], color=df["colors"])
plt.show()

Я создаю еще один столбец с именем colors и инициализирую его для всех red. Затем на основе условия df.Value >= 90 я устанавливаю соответствующие цвета ячеек на blue.
Затем я передаю это гистограмме с аргументом color, и чтобы убедиться, что значения индексов верны, я просто создаюсписок с целыми числами от 0 до len(df).

Надеюсь, это поможет!

...