Tenho alguns dados de consumo de energia de uma casa. Neste DataFrame cada linha mostra um perfil de consumo diário (os valores de energia são números de 0 a 1, um valor por hora) e a última coluna 'Temp_avg' representa a Temperatura Externa Média daquele dia. Abaixo você encontra um DataFrame com a mesma estrutura que o meu, preenchido com números aleatórios.
Depois disso, crio um mapa de cores baseado nos valores de Temp_avg, para que os dias frios sejam plotados em azul e os dias quentes em vermelho. Quanto mais a temperatura estiver alta, mais escura será a cor vermelha dessa linha, e vice-versa para os dias frios.
O que eu quero fazer é mudar a transparência dos "dias quentes" (Temp_avg > 15): já que os dias frios são mais relevantes no DataFrame (4 dias em 6 tem Temp_avg < 15) não quero as linhas azuis ser perturbado por algumas linhas vermelhas que são menos relevantes no DataFrame.
Então, eu quero definir o alfa de "dias quentes" para um valor menor: eles ainda precisam ser coloridos com base no mapa de cores, mas precisam ser mais transparentes, enquanto as linhas mais relevantes precisam manter alfa=1.
Como eu posso fazer isso? E existe uma maneira de automatizar esse processo? Significado: se os dias quentes são menores que os dias frios, os dias quentes tornam-se mais transparentes...
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap, Normalize
# Create 2D panda of 6 rows and 24 columns,
# filled with random values from 0 to 1
random_data = np.random.rand(6,24)
df = pd.DataFrame(random_data)
df.index = ['Day_1', 'Day_2', 'Day_3', 'Day_4', 'Day_5', 'Day_6']
df['Temp_avg'] = [30, 28, 4, 6, 5, 9]
print(df)
# create a color map
cmapR = cm.get_cmap('coolwarm')
norm = Normalize(vmin=df['Temp_avg'].min(), vmax=df['Temp_avg'].max())
colors = [cmapR(norm(v)) for v in df['Temp_avg']]
df.iloc[:, 0:24].T.plot(kind='line', color=colors, legend=False)
plt.show()
0 1 2 ... 22 23 Temp_avg
Day_1 0.806990 0.406354 0.095396 ... 0.492237 0.205613 30
Day_2 0.437527 0.172589 0.285325 ... 0.781534 0.964967 28
Day_3 0.434903 0.175761 0.386593 ... 0.282011 0.539182 4
Day_4 0.465063 0.223923 0.094135 ... 0.372364 0.608879 6
Day_5 0.993202 0.089822 0.976565 ... 0.515035 0.739329 5
Day_6 0.561553 0.759399 0.500864 ... 0.909193 0.723620 9
Você pode contar o número de dias para cada categoria (quente e frio) e definir o valor de alfya de acordo, algo assim:
nb_of_hot_days = (df['Temp_avg']>15).sum()
nb_of_cold_days = (df['Temp_avg']<15).sum()
alpha_cold = 1.0 if nb_of_cold_days > nb_of_hot_days else nb_of_cold_days/nb_of_hot_days
alpha_hot = 1.0 if nb_of_hot_days > nb_of_cold_days else nb_of_hot_days/nb_of_cold_days
levando seu comentário em consideração, você pode tentar isso. Aqui eu uso o fato de que as cores são compostas por 4 valores e o último corresponde ao canal alfa (ou seja, a transparência) e uso o valor em Temp_avg + a proporção do valor Hot e Cold para determinar qual é o mais presente e defina o valor alfa de acordo. Como a tupla é um objeto imutável em python, eu os converto para listar, modifico o valor alfa e os converto de volta para a tupla.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap, Normalize
# Create 2D panda of 6 rows and 24 columns,
# filled with random values from 0 to 1
random_data = np.random.rand(6,24)
df = pd.DataFrame(random_data)
df.index = ['Day_1', 'Day_2', 'Day_3', 'Day_4', 'Day_5', 'Day_6']
df['Temp_avg'] = [30, 28, 4, 6, 5, 9]
print(df)
nb_of_hot_days = (df['Temp_avg']>15).sum()
nb_of_cold_days = (df['Temp_avg']<15).sum()
if nb_of_cold_days > nb_of_hot_days:
cold_days_alpha = 1.0
hot_days_alpha = nb_of_hot_days/nb_of_cold_days
else:
cold_days_alpha = nb_of_cold_days/nb_of_hot_days
hot_days_alpha = 1.0
cmapR = cm.get_cmap('coolwarm')
norm = Normalize(vmin=df['Temp_avg'].min(), vmax=df['Temp_avg'].max())
colors = [tuple(list(cmapR(norm(v))[:3]) + [hot_days_alpha]) if v > 15 else tuple(list(cmapR(norm(v))[:3]) + [cold_days_alpha]) for v in df['Temp_avg']]
# colors_alphas = [(c[:3], 1.0) if ]
df.iloc[:, 0:24].T.plot(kind='line', color=colors, legend=False)
plt.show()
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras