Gu铆a definitiva de mapas de calor en Seaborn con Python

    Introducci贸n

    Un mapa de calor es una t茅cnica de visualizaci贸n de datos que utiliza el color para mostrar c贸mo cambia un valor de inter茅s en funci贸n de los valores de otras dos variables.

    Por ejemplo, podr铆a usar un mapa de calor para comprender c贸mo var铆a la contaminaci贸n del aire seg煤n la hora del d铆a en un conjunto de ciudades.

    Otro caso, quiz谩s m谩s raro, de usar mapas de calor es observar el comportamiento humano: puede crear visualizaciones de c贸mo las personas usan las redes sociales, c贸mo cambiaron sus respuestas en las encuestas a lo largo del tiempo, etc. para instituciones psicol贸gicas que suelen enviar encuestas de autoevaluaci贸n a los pacientes.

    Aqu铆 hay dos mapas de calor que muestran las diferencias en c贸mo dos usuarios usan Twitter:

    Estos gr谩ficos contienen todos los componentes principales de un mapa de calor. Fundamentalmente es una cuadr铆cula de cuadrados de colores donde cada cuadrado, o bin, marca la intersecci贸n de los valores de dos variables que se extienden a lo largo de los ejes horizontal y vertical.

    En este ejemplo, estas variables son:

    • La hora del dia
    • El minuto de la hora

    Los cuadrados est谩n coloreados de acuerdo con la cantidad de tweets que caen en cada contenedor de hora / minuto. Al lado de la cuadr铆cula hay una leyenda que nos muestra c贸mo se relaciona el color con los valores de recuento. En este caso, los colores m谩s claros (o c谩lidos) significan m谩s tweets y los m谩s oscuros (o m谩s fr铆os) significan menos. 隆De ah铆 el nombre mapa de calor!

    Los mapas de calor son m谩s 煤tiles para identificar patrones en grandes cantidades de datos de un vistazo. Por ejemplo, la franja m谩s oscura y fr铆a de la ma帽ana indica que ambos candidatos no twittean mucho antes del mediod铆a. Adem谩s, el segundo usuario tuitea con mucha m谩s frecuencia que el primer usuario, con una l铆nea de corte m谩s n铆tida a las 10 a.m., mientras que el primer usuario no tiene una l铆nea tan clara. Esto se puede atribuir a la programaci贸n personal durante el d铆a, donde el segundo usuario generalmente termina un trabajo asignado a las 10 a.m., seguido de la verificaci贸n en las redes sociales y su uso.

    Los mapas de calor suelen ser un buen punto de partida para an谩lisis m谩s sofisticados. Pero tambi茅n es una t茅cnica de visualizaci贸n llamativa, lo que la convierte en una herramienta 煤til para la comunicaci贸n.

    En este tutorial, le mostraremos c贸mo crear un mapa de calor como el anterior utilizando la biblioteca Seaborn en Python.

    Seaborn es una biblioteca de visualizaci贸n de datos construida sobre Matplotlib. Juntos, son los l铆deres de facto cuando se trata de bibliotecas de visualizaci贸n en Python.

    Seaborn tiene una API de mayor nivel que Matplotlib, lo que nos permite automatizar gran parte de la personalizaci贸n y las peque帽as tareas que normalmente tendr铆amos que incluir para que los gr谩ficos de Matplotlib sean m谩s adecuados para el ojo humano. Tambi茅n se integra estrechamente con las estructuras de datos de Pandas, lo que facilita el procesamiento previo y la visualizaci贸n de datos. Tambi茅n tiene muchas parcelas integradas, con 煤tiles valores predeterminados y un estilo atractivo.

    En esta gu铆a, cubriremos tres secciones principales:

    • Preparaci贸n de datos
    • Trazar un mapa de calor
    • Mejores pr谩cticas y personalizaci贸n de mapas de calor

    隆Empecemos!

    Preparaci贸n de un conjunto de datos para crear un mapa de calor con Seaborn

    Carga de un conjunto de datos de ejemplo con Pandas

    Tenga en cuenta: esta gu铆a se escribi贸 con Python 3.8, Seaborn 0.11.0 y Pandas 1.1.2.

    Para esta gu铆a, utilizaremos un conjunto de datos que contiene las marcas de tiempo de los tweets publicados por dos de los candidatos presidenciales de EE. UU. De 2020 en ese momento, Joe Biden y Donald Trump, entre enero de 2017 y septiembre de 2020. Una descripci贸n del conjunto de datos y c贸mo fue creado se puede encontrar aqu铆 .

    Un ejercicio divertido en casa podr铆a ser crear tu propio conjunto de datos a partir de los tuits propios o de un amigo y comparar tus h谩bitos de uso de las redes sociales.

    Nuestra primera tarea es cargar esos datos y transformarlos en la forma que Seaborn espera, y es f谩cil para nosotros trabajar.

    Usaremos la biblioteca de Pandas para cargar y manipular datos:

    import pandas as pd
    

    Podemos usar la read_csv()funci贸n Pandas para cargar el conjunto de datos de recuento de tweets. Puede pasar la URL que apunta al conjunto de datos o descargarla y hacer referencia al archivo manualmente:

    data_url = "https://bit.ly/3cngqgL" # or "path/to/biden_trump_tweets.csv"
    df = pd.read_csv(data_url, 
                     parse_dates=['date_utc'], 
                     dtype={'hour_utc':int,'minute_utc':int,'id':str}
                    )
    

    Siempre vale la pena usar el headm茅todo para examinar las primeras filas del DataFrame, para familiarizarse con su forma:

    df.head()
    

    id
    nombre de usuario
    date_utc
    hour_utc
    minute_utc
    retweets
    01234

    815422340540547073realDonaldTrump2017-01-01 05:00:10+00:005027134
    815930688889352192realDonaldTrump2017-01-02 14:40:10+00:00144023930
    815973752785793024realDonaldTrump2017-01-02 17:31:17+00:00173114119
    815989154555297792realDonaldTrump2017-01-02 18:32:29+00:0018323193
    815990335318982656realDonaldTrump2017-01-02 18:37:10+00:0018377337

    Aqu铆, hemos impreso los primeros 5 elementos en DataFrame. Primero tenemos el 铆ndice de cada fila, seguido por el iddel tweet, el usernamedel usuario que twitte贸 ese tweet, as铆 como la informaci贸n relacionada con el tiempo como date_utc, hour_utcy minute_utc.

    Finalmente, tenemos el n煤mero de retweetsal final, que se puede usar para verificar si hay una relaci贸n interesante entre el contenido de los tweets y la “atenci贸n” que recibi贸.

    Transformar los datos en un DataFrame de formato ancho

    Es com煤n encontrar datos de registro como este organizados en un formato largo (o ordenado). Esto significa que hay una columna para cada variable y cada fila de datos es una 煤nica observaci贸n (valor espec铆fico) de esas variables. Aqu铆, cada tweet es cada variable. Cada fila corresponde a un tweet y contiene datos sobre 茅l.

    Pero, conceptualmente, un mapa de calor requiere que los datos se organicen en una forma corta (o amplia). Y, de hecho, la biblioteca de Seaborn requiere que tengamos los datos en esta forma para producir visualizaciones de mapas de calor como las que hemos visto antes.

    Los datos de formato ancho tienen los valores de las variables independientes como encabezados de fila y columna y los valores de la variable dependiente est谩n contenidos en las celdas.

    Esto b谩sicamente significa que estamos usando todas las propiedades que no estamos observando como categor铆as. Tenga en cuenta que algunas categor铆as aparecen m谩s de una vez. Por ejemplo, en la tabla original, tenemos algo como:

    nombre de usuariohour_utcminuto_utc
    realDonaldTrump124
    realDonaldTrump130
    realDonaldTrump124

    Usando el principio de categor铆a, podemos acumular las ocurrencias de ciertas propiedades:

    categor铆aocurrencias
    realDonaldTrump | 12 horas | 4 minutos2
    realDonaldTrump | 13 horas | 0 minutos1

    Que finalmente podemos transformar en algo m谩s compatible con mapas de calor:

    horas minutos01234
    1200002
    1310000

    Aqu铆, tenemos horas como filas, como valores 煤nicos, as铆 como minutos como columnas. Cada valor en las celdas es el n煤mero de ocurrencias de tweets en ese momento. Por ejemplo, aqu铆 podemos ver 2 tweets a las 12:04 y un tweet a las 13:01. Con este enfoque, solo tenemos 24 filas (24 horas) y 60 columnas. Si imagina esta propagaci贸n visualmente, esencialmente es un mapa de calor, sin embargo, con n煤meros.

    En nuestro ejemplo, quiero entender si hay alg煤n patr贸n en c贸mo los candidatos tuitean en diferentes momentos del d铆a. Una forma de hacer esto es contar los tweets creados en cada hora del d铆a y cada minuto de una hora.

    T茅cnicamente, tenemos 2880 categor铆as. Cada combinaci贸n de hour_utc, minute_utcy usernamees una categor铆a separada, y contamos el n煤mero de ocurrencias de tweets para cada uno de ellos.

    Esta agregaci贸n es sencilla con Pandas. La hora y el minuto de creaci贸n est谩n disponibles en las columnas hour_utcy minute_utc. Podemos utilizar la pandas groupby()funci贸n de recoger juntos todos los tweets para cada combinaci贸n de username, hour_utcy minute_utc:

    g = df.groupby(['hour_utc','minute_utc','username'])
    

    Esto significa que s贸lo filas que tienen el mismo valor de hour_utc, minute_utc, usernamepueden considerarse una ocurrencia de la misma categor铆a.

    Ahora podemos contar el n煤mero de tweets en cada grupo aplicando la nunique()funci贸n para contar el n煤mero de correos electr贸nicos 煤nicos id. Este m茅todo evita el doble recuento de los tweets duplicados que puedan estar al acecho en los datos, si no se limpian correctamente de antemano:

    tweet_cnt = g.id.nunique()
    

    Esto nos da una serie Pandas con los recuentos que necesitamos para trazar el mapa de calor:

    tweet_cnt.head()
    
    hour_utc  minute_utc  username       
    0         0           JoeBiden           26
                          realDonaldTrump     6
              1           JoeBiden           16
                          realDonaldTrump    11
              2           JoeBiden            6
    Name: id, dtype: int64
    

    Para transformar esto en la forma ancha que DataFramenecesita Seaborn, podemos usar la pivot()funci贸n Pandas .

    Para este ejemplo, ser谩 m谩s f谩cil tomar un usuario a la vez y trazar un mapa de calor para cada uno de ellos por separado. Podemos poner esto en una sola figura o en figuras separadas.

    Utilice el loc[]acceso de Pandas para seleccionar el recuento de tweets de un usuario y luego aplique la pivot()funci贸n. Utiliza valores 煤nicos del 铆ndice / columnas especificados para formar ejes del archivo DataFrame. Giraremos las horas y los minutos para que el resultado DataFrametenga una forma amplia:

    jb_tweet_cnt = tweet_cnt.loc[:,:,'JoeBiden'].reset_index().pivot(index='hour_utc', columns="minute_utc", values="id")
    

    Luego, eche un vistazo a una secci贸n del resultado DataFrame:

    jb_tweet_cnt.iloc[:10,:9]
    

    minuto_utc012345678 hora_utc0123456101112

    26.016.06.07.04.024.02.02.09.0
    24.07.05.06.04.019.01.02.06.0
    3.03.03.0Yaya5.01.04.08.0Yaya
    3.03.03.04.05.01.03.05.04.0
    1.01.01.02.0YayaYaya1.01.01.0
    1.02.0YayaYayaYaya1.0YayaYayaYaya
    YayaYayaYayaYayaYayaYayaYayaYayaYaya
    7.02.01.0YayaYayaYayaYayaYayaYaya
    2.05.0YayaYayaYayaYayaYayaYayaYaya
    4.0Yaya1.01.01.0Yaya1.0YayaYaya

    Lidiar con los valores perdidos

    Podemos ver arriba que nuestros datos transformados contienen valores perdidos. Siempre que no haya tweets para una combinaci贸n determinada de minuto / hora, la pivot()funci贸n inserta un valor Not-a-Number ( NaN) en el DataFrame.

    Adem谩s pivot(), no crea una fila (o columna) cuando no hubo tweets durante una hora (o minuto) en particular.

    Ver m谩s arriba, donde horas 7, 8y 9est谩n desaparecidos.

    Esto ser谩 algo com煤n que suceda al preprocesar datos. Es posible que falten datos, que sean de tipos o entradas extra帽os (sin validaci贸n), etc.

    Seaborn puede manejar bien estos datos faltantes, simplemente trazar谩 sin ellos, salt谩ndose las horas 7, 8 y 9. Sin embargo, nuestros mapas de calor ser谩n m谩s consistentes e interpretables si completamos los valores faltantes. En este caso, sabemos que los valores perdidos son realmente una cuenta de cero.

    Para completar los NaNs que ya se han insertado, use fillna()as铆:

    jb_tweet_cnt.fillna(0, inplace=True)
    

    Para insertar filas desaparecidos – Aseg煤rese de que todas las combinaciones de hora y minuto aparecen en el mapa de calor – vamos a reindex()la DataFrameque insertamos los 铆ndices desaparecidas y sus valores:

    # Ensure all hours in table
    jb_tweet_cnt = jb_tweet_cnt.reindex(range(0,24), axis=0, fill_value=0)
    # Ensure all minutes in table
    jb_tweet_cnt = jb_tweet_cnt.reindex(range(0,60), axis=1, fill_value=0).astype(int) 
    

    Excelente. Ahora podemos completar nuestra preparaci贸n de datos repitiendo los mismos pasos para los tweets de otros candidatos:

    dt_tweet_cnt = tweet_cnt.loc[:,:,'realDonaldTrump'].reset_index().pivot(index='hour_utc', columns="minute_utc", values="id")
    dt_tweet_cnt.fillna(0, inplace=True)
    dt_tweet_cnt = dt_tweet_cnt.reindex(range(0,24), axis=0, fill_value=0)
    dt_tweet_cnt = dt_tweet_cnt.reindex(range(0,60), axis=1, fill_value=0).astype(int)
    

    Creaci贸n de un mapa de calor b谩sico con Seaborn

    Ahora que hemos preparado los datos, es f谩cil trazar un mapa de calor con Seaborn. Primero aseg煤rese de haber importado la biblioteca Seaborn:

    import seaborn as sns
    import matplotlib.pyplot as plt
    

    Tambi茅n importaremos el m贸dulo PyPlot de Matplotlib, ya que Seaborn se basa en 茅l como motor subyacente. Despu茅s de trazar gr谩ficos con funciones de Seaborn adecuadas, siempre llamaremos plt.show()para mostrar realmente estos gr谩ficos.

    Ahora, como es habitual con Seaborn, trazar datos es tan simple como pasar un preparado DataFramea la funci贸n que nos gustar铆a usar. Espec铆ficamente, usaremos la heatmap()funci贸n.

    Tracemos un mapa de calor simple de la actividad de Trump en Twitter:

    sns.heatmap(dt_tweet_cnt)
    plt.show()
    

    Y luego el de Biden:

    sns.heatmap(jb_tweet_cnt)
    plt.show()
    

    Los mapas de calor producidos con la configuraci贸n predeterminada de Seaborn se pueden utilizar de inmediato. Muestran los mismos patrones que se ven en los gr谩ficos al principio de la gu铆a, pero son un poco m谩s entrecortados, m谩s peque帽os y las etiquetas de los ejes aparecen con una frecuencia impar.

    Aparte de eso, podemos ver estos patrones porque Seaborn hace mucho trabajo por nosotros, autom谩ticamente, simplemente llamando a la heatmap()funci贸n:

    • Hizo elecciones apropiadas de paleta de colores y escala.
    • Cre贸 una leyenda para relacionar los colores con los valores subyacentes.
    • Rotul贸 los ejes

    Estos valores predeterminados pueden ser lo suficientemente buenos para sus prop贸sitos y examen inicial, como aficionado o cient铆fico de datos. Pero a menudo, producir un mapa de calor realmente efectivo requiere que personalicemos la presentaci贸n para satisfacer las necesidades de la audiencia.

    Echemos un vistazo a c贸mo podemos personalizar un mapa de calor de Seaborn para producir los mapas de calor que se ven al principio de la gu铆a.

    C贸mo personalizar un mapa de calor de Seaborn

    Usar el color con eficacia

    La caracter铆stica definitoria de un mapa de calor es el uso del color para representar la magnitud de una cantidad subyacente.

    Es f谩cil cambiar los colores que usa Seaborn para dibujar el mapa de calor especificando el cmappar谩metro opcional (mapa de colores ). Por ejemplo, aqu铆 se explica c贸mo cambiar a la 'mako'paleta de colores:

    sns.heatmap(dt_tweet_cnt, cmap="mako")
    plt.show()
    

    Seaborn proporciona muchas paletas integradas entre las que puede elegir, pero debe tener cuidado de elegir una buena paleta para sus datos y prop贸sito.

    Para mapas de calor que muestran datos num茅ricos, como el nuestro, las paletas secuenciales como las predeterminadas 'rocket'o 'mako'son buenas opciones. Esto se debe a que los colores de estas paletas se han elegido para que sean perceptualmente uniformes. Esto significa que la diferencia que percibimos entre dos colores con nuestros ojos es proporcional a la diferencia entre los valores subyacentes.

    El resultado es que al echar un vistazo al mapa podemos tener una idea inmediata de la distribuci贸n de valores en los datos.

    Un contraejemplo demuestra los beneficios de una paleta perceptualmente uniforme y las trampas de una mala elecci贸n de paleta. Aqu铆 est谩 el mismo mapa de calor dibujado con la tab10paleta:

    sns.heatmap(dt_tweet_cnt, cmap="tab10")
    plt.show()
    

    Esta paleta es una mala elecci贸n para nuestro ejemplo porque ahora tenemos que trabajar muy duro para comprender la relaci贸n entre diferentes colores. 隆Ha oscurecido en gran medida los patrones que antes eran obvios!

    Esto se debe a que la tab10paleta utiliza cambios de tono para facilitar la distinci贸n entre categor铆as. Puede ser una buena opci贸n si los valores de su mapa de calor fueran categ贸ricos.

    Si est谩 interesado en los valores altos y bajos de sus datos, podr铆a considerar usar una paleta divergente como coolwarmo icefireque es un esquema uniforme que resalta ambos extremos.

    Para obtener m谩s informaci贸n sobre la selecci贸n de paletas de colores, la documentaci贸n de Seaborn tiene una gu铆a 煤til .

    Controle el efecto de distorsi贸n de los valores at铆picos

    Los valores at铆picos en los datos pueden causar problemas al trazar mapas de calor. De forma predeterminada, Seaborn establece los l铆mites de la escala de colores al valor m铆nimo y m谩ximo en los datos.

    Esto significa que valores extremadamente grandes (o peque帽os) en los datos pueden hacer que los detalles se oculten. Cuanto m谩s extremos sean los valores at铆picos, m谩s lejos estamos de un paso de coloraci贸n uniforme. Hemos visto el efecto que esto puede tener con los diferentes mapas de colores.

    Por ejemplo, si agregamos un valor de valor at铆pico extremo, como 400 ocurrencias de tweets en un solo minuto, ese valor at铆pico cambiar谩 la extensi贸n del color y lo distorsionar谩 significativamente:

    Una forma de manejar valores extremos sin tener que eliminarlos del conjunto de datos es usar el robustpar谩metro opcional . Si se establece robusten True, Seaborn establezca los l铆mites de la escala de color en los valores de los percentiles 2 y 98 de los datos, en lugar de los valores m谩ximo y m铆nimo. Esto, en la gran mayor铆a de los casos, normalizar谩 la dispersi贸n del color en un estado mucho m谩s utilizable.

    Tenga en cuenta que en nuestro ejemplo, esto vari贸 la ocurrencia / propagaci贸n del color desde 0..16, a diferencia 0..40de antes. Esto no es ideal, pero es una soluci贸n r谩pida y f谩cil para valores extremos.

    Eso puede traer de vuelta los detalles como muestra el ejemplo de la derecha. Tenga en cuenta que el punto de valor extremo todav铆a est谩 presente en el gr谩fico; los valores superiores o inferiores a los l铆mites de la escala de colores se recortan a los colores de los extremos de la escala.

    Tambi茅n es posible establecer manualmente los l铆mites de la escala de colores configurando los valores de los par谩metros vminy vmax. Puede ser muy 煤til si planea tener dos mapas de calor uno al lado del otro y desea garantizar la misma escala de colores para cada uno:

    sns.heatmap(tmp, vmin=0, vmax=40)
    plt.show()
    

    Composici贸n: ordenaci贸n de las relaciones entre ejes y superficies

    En nuestro ejemplo los valores que componen los ejes de nuestro mapa de calor, las horas y los minutos, tienen un orden natural. Es importante tener en cuenta que estos son valores discretos, no continuos y que se pueden reorganizar para ayudar a los patrones de superficie en los datos.

    Por ejemplo, en lugar de tener los minutos en el orden ascendente normal, podr铆amos optar por ordenarlos en funci贸n de qu茅 minuto tiene la mayor cantidad de tweets:

    Esto proporciona una nueva presentaci贸n alternativa de los datos del recuento de tweets. Desde el primer mapa de calor, podemos ver que Biden prefiere tuitear en las marcas trimestre ( 30, 45, 0y 15m谩s all谩 de la hora), de forma similar a c贸mo ciertos individuos puesto su volumen del televisor en incrementos de 5, o cu谩ntas personas tienden a “espera para el el momento adecuado “para comenzar a realizar una tarea, generalmente en un n煤mero redondo o en un cuarto.

    Por otro lado, no parece haber un minuto favorable en el segundo mapa de calor. Hay una distribuci贸n bastante constante a lo largo de todos los minutos de la hora y no hay muchos patrones que se puedan observar.

    En otros contextos, la ordenaci贸n y / o agrupaci贸n cuidadosa de las variables categ贸ricas que componen los ejes del mapa de calor puede ser 煤til para resaltar patrones en los datos y aumentar la densidad de informaci贸n del gr谩fico.

    Agregar anotaciones de valor

    Una desventaja de los mapas de calor es que es dif铆cil hacer comparaciones directas entre valores. Un gr谩fico de barras o de l铆neas es una forma mucho m谩s sencilla de hacer esto.

    Sin embargo, es posible aliviar este problema agregando anotaciones al mapa de calor para mostrar los valores subyacentes. Esto se hace f谩cilmente en Seaborn estableciendo el annotpar谩metro en True, as铆:

    sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], annot=True)
    plt.show()
    

    Hemos recortado los datos en un conjunto m谩s peque帽o para que sea m谩s f谩cil ver y comparar algunos de estos contenedores. Aqu铆, cada contenedor ahora est谩 anotado con los valores subyacentes, lo que hace que sea mucho m谩s f谩cil compararlos. Aunque no es tan natural e intuitivo como un gr谩fico de l铆neas o un gr谩fico de barras, sigue siendo 煤til.

    Trazar estos valores en todo el mapa de calor que tenemos no ser铆a pr谩ctico, ya que los n煤meros ser铆an demasiado peque帽os para leerlos.

    Un compromiso 煤til puede ser agregar anotaciones solo para ciertos valores interesantes. En el siguiente ejemplo, agreguemos una anotaci贸n solo para el valor m谩ximo.

    Esto se hace creando un conjunto de etiquetas de anotaci贸n que se pueden pasar a la heatmap()funci贸n de Seaborn a trav茅s del annotpar谩metro. El annot_kwspar谩metro tambi茅n se puede utilizar para controlar aspectos de la etiqueta como el tama帽o de la fuente utilizada:

    # Create data labels, using blank string if under threshold value
    M = jb_tweet_cnt.iloc[14:23,25:35].values.max()
    labels = jb_tweet_cnt.iloc[14:23,25:35].applymap(lambda v: str(v) if v == M else '')
    
    # Pass the labels to heatmap function
    sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], annot=labels, annot_kws={'fontsize':16}, fmt="")
    
    plt.show()
    

    Puede ser creativo al definir conjuntos de etiquetas personalizados. La 煤nica restricci贸n es que los datos que pasa para las etiquetas deben tener el mismo tama帽o que los datos que est谩 trazando. Adem谩s, si sus etiquetas son cadenas, debe pasar el fmt=""par谩metro para evitar que Seaborn interprete sus etiquetas como n煤meros.

    Cuadr铆culas y cuadrados

    De vez en cuando, es 煤til recordarle a su audiencia que un mapa de calor se basa en contenedores de cantidades discretas. Con algunos conjuntos de datos, el color entre dos contenedores puede ser muy similar, creando una textura similar a un degradado que hace que sea m谩s dif铆cil discernir entre valores espec铆ficos. El par谩metro linewidthy linecolorse puede utilizar para agregar l铆neas de cuadr铆cula al mapa de calor.

    De manera similar, el par谩metro squarepuede usarse para forzar que la relaci贸n de aspecto de los cuadrados sea verdadera. Tenga en cuenta que no necesita usar cuadrados para los contenedores.

    Agreguemos una l铆nea blanca delgada entre cada contenedor para enfatizar que son entradas separadas:

    sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], linewidth=1, linecolor="w", square=True)
    
    plt.show()
    

    En cada uno de estos casos, depende de su juicio si estos cambios est茅ticos promueven los objetivos de su visualizaci贸n o no.

    Mapas de calor categ贸ricos en Seaborn

    Hay ocasiones en las que es 煤til simplificar un mapa de calor colocando datos num茅ricos en categor铆as. Por ejemplo podr铆amos bucket los datos de recuento tuit en s贸lo tres categor铆as 'high', 'medium'y 'low', en lugar de un rango num茅rico como 0..40.

    Desafortunadamente, en el momento de escribir este art铆culo, Seaborn no tiene la capacidad incorporada para producir mapas de calor para datos categ贸ricos como este, ya que espera una entrada num茅rica. Aqu铆 hay un fragmento de c贸digo que muestra que es posible “falsificarlo” con un poco de pirateo de paleta y barra de colores.

    Aunque esta es una circunstancia en la que es posible que desee considerar el m茅rito de otros paquetes de visualizaci贸n que tienen estas caracter铆sticas integradas.

    Usaremos la ayuda de Matplotlib, el motor subyacente debajo de Seaborn, ya que tiene muchas opciones de personalizaci贸n de bajo nivel y tenemos acceso completo a 茅l. Aqu铆, podemos “piratear” la leyenda de la derecha para mostrar los valores que nos gustar铆a:

    import matplotlib.pyplot as plt
    
    fig,ax = plt.subplots(1,1,figsize=(18,8))
    my_colors=[(0.2,0.3,0.3),(0.4,0.5,0.4),(0.1,0.7,0),(0.1,0.7,0)]
    
    sns.heatmap(dt_tweet_cnt, cmap=my_colors, square=True, linewidth=0.1, linecolor=(0.1,0.2,0.2), ax=ax)
    
    colorbar = ax.collections[0].colorbar
    M=dt_tweet_cnt.max().max()
    colorbar.set_ticks([1/8*M,3/8*M,6/8*M])
    colorbar.set_ticklabels(['low','med','high'])
    
    plt.show()
    

    Preparaci贸n de mapas de calor para la presentaci贸n

    Un par de 煤ltimos pasos para dar los toques finales a su mapa de calor.

    Uso del contexto de Seaborn para controlar la apariencia

    La set_context()funci贸n proporciona una forma 煤til de controlar algunos de los elementos del gr谩fico sin cambiar su estilo general. Por ejemplo, puede ser una forma conveniente de personalizar tama帽os de fuente y familias.

    Hay varios contextos preestablecidos disponibles :

    sns.set_context("notebook", font_scale=1.75, rc={"lines.linewidth": 2.5, 'font.family':'Helvetica'})
    

    Uso de subparcelas para controlar el dise帽o de mapas de calor

    El 煤ltimo paso para crear nuestro mapa de calor de recuento de tweets es colocar los dos gr谩ficos uno al lado del otro en una sola figura para que sea f谩cil hacer comparaciones entre ellos.

    Podemos usar la subplot()funci贸n de matplotlib.pyplotpara controlar el dise帽o de mapas de calor en Seaborn. Esto le dar谩 el m谩ximo control sobre el gr谩fico final y permitir谩 una f谩cil exportaci贸n de la imagen.

    Crear subtramas usando Matplotlib es tan f谩cil como definir su forma (2 subtramas en 1 columna en nuestro caso):

    import matplotlib.pyplot as plt
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12,12))
    sns.heatmap(jb_tweet_cnt, ax=ax1)
    sns.heatmap(dt_tweet_cnt, ax=ax2)
    
    plt.show()
    

    Esto es esencialmente, aunque carece del estilo que hemos visto al principio. Reunamos muchas de las personalizaciones que hemos visto en la gu铆a para producir nuestro gr谩fico final y exportarlo .pngpara compartirlo:

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots(2, 1, figsize=(24,12))
    
    for i,d in enumerate([jb_tweet_cnt,dt_tweet_cnt]):
       
        labels = d.applymap(lambda v: str(v) if v == d.values.max() else '')
        sns.heatmap(d,
                    cmap="viridis",  # Choose a squential colormap
                    annot=jb_labels, # Label the maximum value
                    annot_kws={'fontsize':11},  # Reduce size of label to fit
                    fmt="",          # Interpret labels as strings
                    square=True,     # Force square cells
                    vmax=40,         # Ensure same 
                    vmin=0,          # color scale
                    linewidth=0.01,  # Add gridlines
                    linecolor="#222",# Adjust gridline color
                    ax=ax[i],        # Arrange in subplot
                   )
        
    ax[0].set_title('@JoeBiden')
    ax[1].set_title('@realDonaldTrump')
    ax[0].set_ylabel('Hour of Day')
    ax[1].set_ylabel('Hour of Day')
    ax[0].set_xlabel('')
    ax[1].set_xlabel('Minute of Hour')
    plt.tight_layout()
    plt.savefig('final.png', dpi=120)
    

    Conclusi贸n

    En esta gu铆a, analizamos los mapas de calor y c贸mo crearlos con Python y la biblioteca de visualizaci贸n de Seaborn.

    La fuerza de los mapas de calor est谩 en la forma en que usan el color para transmitir informaci贸n, en otras palabras, hace que sea f谩cil para cualquiera ver patrones amplios de un vistazo.

    Hemos visto c贸mo para hacer esto tenemos que hacer selecciones cuidadosas de paleta de colores y escala. Tambi茅n hemos visto que hay varias opciones disponibles para personalizar un mapa de calor usando Seaborn con el fin de enfatizar aspectos particulares del gr谩fico. Estos incluyen anotaciones, agrupaci贸n y ordenaci贸n de ejes categ贸ricos y dise帽o.

    Como siempre, se requiere un juicio editorial por parte del Visualizador de datos para elegir las personalizaciones m谩s apropiadas para el contexto de la visualizaci贸n.

    Hay muchas variantes del mapa de calor que puede interesarle estudiar, incluidos mapas de calor radiales, diagramas de mosaico o gr谩ficos matriciales.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *