Como plotar várias linhas com diferentes transparências com base em uma condição (Python)?

Lorenzo Siboni

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

insira a descrição da imagem aqui

minha rede

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.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como plotar várias linhas em uma figura no Pandas Python com base em dados de várias colunas?

Como contar linhas exclusivas em uma coluna com base em várias condições em python

Como plotar uma figura com várias linhas em python usando

como selecionar várias linhas como um grupo com base em uma condição de coluna em pandas

Como selecionar / contar linhas em uma coluna com base em várias condições

Pyspark - filtre várias linhas com base em uma condição em uma linha

Como selecionar várias linhas com base em uma coluna

Como extrair linhas com base em uma condição?

Como dividir uma condição "se" em linhas de várias linhas com comentários

Operar em várias linhas com base em uma condição de outra tabela

Excluir várias linhas em R com base em uma condição is.na

Extração de várias linhas para cada ID com base em uma condição

Como obter aprovação / reprovação para a condição com base em várias linhas?

Excluindo linhas com base em uma condição Python Pandas

Como posso contar o número de maneiras de selecionar valores em linhas diferentes com base em uma condição?

Como posso filtrar várias linhas com valores de coluna correspondentes com base em todas as linhas que atendem a uma determinada condição? [R]

Como selecionar várias linhas em uma coluna com uma determinada condição

Consulta Postgres para combinar várias linhas em uma com base na condição de status

Como remover * algumas * linhas com base em uma determinada condição pandas / python

Como atualizar várias linhas de pandas com condição de filtro em uma chamada

Como selecionar valores com uma condição em várias colunas e várias linhas em pandas (prática recomendada)

Divida uma coluna contendo uma lista em várias linhas no Pandas com base em uma condição

Como alterar valores em uma seção de coluna com base em várias condições?

Python: no Pandas, extraia dados de várias colunas em um dataframe com base em uma condição e adiciona a diferentes dataframes correspondentes em uma coluna

Python: no Pandas, extraia dados de várias colunas em um dataframe com base em uma condição e adiciona a diferentes dataframes correspondentes em uma coluna

Como concatenar com base em uma condição em python

Eliminar várias colunas com base em uma condição

preencher várias colunas com base em uma condição?

Python - como faço a contagem condicional de linhas com base em várias colunas?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo