Breaking

Post Top Ad

Your Ad Spot

martes, 25 de junio de 2019

Uso de Plotly Library para la visualización interactiva de datos en Python

En mi artículo anterior , expliqué cómo se puede usar la biblioteca de Pandas para trazar gráficos básicos y de series de tiempo. Si bien las bibliotecas Pandas , Matplotlib y Seaborn son excelentes bibliotecas de trazado de datos, solo pueden trazar gráficos estáticos. Los diagramas estáticos son como imágenes simples no interactivas. En la mayoría de los casos, los gráficos estáticos son suficientes para transmitir la información. Sin embargo, en algunos casos es posible que desee agregar interactividad del usuario a sus parcelas.
En este artículo, veremos cómo se puede usar la biblioteca Plotly de Python para trazar gráficos interactivos. Trazaremos los datos geográficos de forma gráfica y explicaremos cómo un usuario puede interactuar con dichas gráficas.

Instalación de bibliotecas requeridas

Para instalar la biblioteca Plotly usando la utilidad "pip", necesita ejecutar el siguiente comando:
$ pip install plotly
Además de Plotly, también usaremos Cufflinks , que funciona como un conector entre la biblioteca de Pandas y Plotly, y nos ayuda a trazar gráficos interactivos directamente utilizando un marco de datos de Pandas.
Para instalar Cufflinks usando pip, ejecute el siguiente script:
$ pip install cufflinks

Importando Bibliotecas Requeridas

Plotly es básicamente una biblioteca en línea que aloja sus visualizaciones de datos, sin embargo, también proporciona un paquete de datos fuera de línea que se puede usar para dibujar gráficos interactivos fuera de línea.
Antes de que podamos ejecutar Plotly en el cuaderno de Jupyter, que utilizo para ejecutar mis scripts, debo importar las bibliotecas de Plotly y Cufflinks junto con Numpy y Pandas como de costumbre.
El siguiente script importa las librerías Numpy y Pandas:
import pandas as pd  
import numpy as np  
%matplotlib inline
A continuación, debemos importar las versiones fuera de línea de los módulos de Plotly que usaremos en este artículo. El siguiente script hace eso:
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot  
Antes de que podamos ejecutar nuestros scripts, necesitamos conectar el JavaScript a nuestro cuaderno. Como Plotly Plots son interactivos, utilizan JavaScript detrás de escena. Los scripts que vamos a ejecutar se ejecutarán en el cuaderno de Jupyter. Para conectar el portátil Jupyter con JavaScript, necesitamos ejecutar el siguiente script:
init_notebook_mode(connected=True)  
Finalmente, debemos importar la biblioteca de Cufflink y asegurarnos de que la usaremos sin conexión. Para hacerlo, ejecute el siguiente script:
import cufflinks as cf  
cf.go_offline()  
Ahora tenemos todo lo que necesitamos para dibujar gráficos Plotly interactivos dentro de nuestros cuadernos Jupyter.

Plotly para parcelas básicas

En esta sección, usaremos la biblioteca de Plotly para dibujar gráficos básicos interactivos. En la siguiente sección, veremos cómo se puede usar Plotly para trazar datos geográficos.

El conjunto de datos

El conjunto de datos que vamos a utilizar para esta sección es el conjunto de datos "Sugerencias" que se descarga de forma predeterminada con la biblioteca Seaborn. El conjunto de datos contiene información sobre la cantidad gastada por un grupo de personas en el almuerzo y la cena. El conjunto de datos contiene género, precio, propinas, edad, tamaño, día, hora y si las personas que almorzaron o cenaron fueron fumadoras o no.
La siguiente secuencia de comandos importa el conjunto de datos y muestra las primeras cinco filas del conjunto de datos:
import seaborn as sns

dataset = sns.load_dataset('tips')

dataset.head()  
La salida del script se ve así:
Desde la salida, se puede ver que nuestro conjunto de datos contiene tres columnas numéricas: total_billtip, y sizey cuatro columnas categóricos: sexsmokerday, y time.
Antes de usar Plotly para dibujar gráficos interactivos, recordemos cómo usamos Pandas para trazar gráficos estáticos. Llamemos al plot()método en nuestro marco de datos para ver cómo Pandas traza diagramas estáticos. Trazaremos los valores para las columnas 'total_bill', 'tip' y 'sex'. Mira el siguiente script:
dataset2 = dataset[["total_bill", "tip", "size"]]  
dataset2.plot()  
Puede ver que para trazar un gráfico, simplemente llamamos el plotmétodo en nuestro marco de datos.
Salida:
Desde la salida, puede ver el trazado de línea estático para las columnas 'total_bill' y 'tips'.
Ahora veamos cómo podemos dibujar gráficos interactivos usando Plotly. En la sección donde importamos las bibliotecas, importamos la plot()función desde el plotly.offlinemódulo. Para trazar diagramas interactivos utilizando el marco de datos de Pandas, simplemente necesitamos llamar al iplot()método en lugar del plotmétodo. Echa un vistazo al siguiente ejemplo:
dataset2.iplot()  
Una vez que ejecute el script anterior, debería ver un trazado de línea interactivo para las columnas total_billcomo se muestra a continuación:tipsex
Si pasas el cursor sobre la trama, deberías ver los valores cambiando. Puede acercar y alejar la parcela utilizando las opciones disponibles en la esquina superior derecha de la parcela. También puede agregar y eliminar columnas de la trama. Por último, también puede guardar el gráfico como una imagen estática.
En el resto de la sección, trazaremos algunos de los gráficos interactivos más utilizados utilizando Plotly.

La parcela de bar

Para trazar el gráfico de barras interactivo utilizando Plotly, puede utilizar la iplot()función. Debe pasar "barra" como valor para el kindparámetro de la iplot()función. Además, debe pasar la lista de las columnas categóricas para las que desea trazar sus gráficos al xatributo. Finalmente, la columna numérica se pasa como un valor al yatributo. La siguiente secuencia de comandos traza un gráfico de barras para las columnas timesexen el eje xy en el eje y total_bill.
dataset.iplot(kind='bar', x=['time', 'sex'],y='total_bill')  
Salida:
Se puede ver en la salida que se han trazado cuatro barras para la factura total. Las barras muestran todas las combinaciones posibles de valores en las columnas sextime.
Además de especificar columnas para los gráficos de barras, puede simplemente llamar a una función agregada en el marco de datos de Pandas y luego llamar a la iplot()función y pasar "barra" como el valor para el kindatributo. Esto trazará la barra para cada columna numérica según la función agregada. Por ejemplo, si desea trazar el gráfico de barras que contiene los valores promedio para total_billtipy la sizecolumna, puede usar el siguiente script:
dataset.mean().iplot(kind='bar')  
Salida:
En la salida, puede ver los gráficos de barras con valores medios para total_billtipsizecolumna.
Además de los gráficos de barras verticales, también puede trazar gráficos de barras horizontales. Todo lo que tienes que hacer es pasar "barh" como un atributo al kindparámetro, como se muestra en el siguiente script:
dataset.mean().iplot(kind='barh')  
Salida:
En la salida, se puede ver los diagramas de barras horizontales para los valores medios de total_billtipsizecolumnas.

La trama de dispersión

Para trazar un diagrama de dispersión interactivo, debe pasar "dispersión" como el valor para el kindparámetro de la iplot()función. Además, debe pasar los nombres de columna para los ejes x e y. La siguiente secuencia de comandos traza un diagrama de dispersión para la total_billcolumna en el eje xy la columna en el eje y tip.
dataset.iplot(kind='scatter', x='total_bill', y='tip', mode='markers')  
Salida:
Mueva el mouse sobre el gráfico interactivo para ver los valores cambiantes de total_billy las tipcolumnas.

El diagrama de caja

En uno de mis artículos anteriores, expliqué qué es un diagrama de caja y cómo podemos dibujarlo utilizando la biblioteca Seaborn. La gráfica de caja representa la información del cuartil para las columnas numéricas. La distancia entre el bigote inferior y la parte inferior de la caja muestra el primer cuartil. La distancia entre la parte inferior del cuadro y la mitad del cuadro muestra el segundo cuartil. De manera similar, la distancia desde el centro de la caja hasta el extremo superior de la caja cuantifica el tercer cuartil, mientras que la distancia desde la parte superior de la caja hasta el bigote superior muestra el último cuartil.
Usando Plotly, puedes dibujar diagramas de caja interactivos. Todo lo que tiene que hacer es pasar el boxvalor como al kindparámetro de la iplot()función como se muestra a continuación:
dataset2.iplot(kind='box')  
En la salida, verá diagramas de cuadro para todas las columnas numéricas en los datos total_billes decir tipsize
Salida:

La trama del hist

La biblioteca de Plotly también se puede usar para trazar gráficos de histogramas interactivos para cualquier columna en el conjunto de datos. Para hacerlo, debe pasar "hist" como valor al kindparámetro de la iplot()función. También puede especificar el número de bandejas utilizando el binsatributo. El siguiente script traza el histograma de la total_billcolumna:
dataset['total_bill'].iplot(kind='hist',bins=25)  
Salida:

El diagrama de la matriz de dispersión

El gráfico de matriz de dispersión es básicamente un conjunto de todos los gráficos de dispersión para columnas numéricas en su conjunto de datos.
dataset2.scatter_matrix()  

La parcela de propagación

La gráfica de distribución muestra la extensión entre dos o más columnas numéricas en cualquier punto en particular. Por ejemplo, para ver la propagación entre total_biltip, puede utilizar la función de propagación de la siguiente manera:
dataset[['total_bill','tip']].iplot(kind='spread')  
Salida:
Desde la salida, puedes ver que a medida que total_billaumenta, la dispersión entre total_billtiptambién aumenta.

Parcelas 3D

Finalmente, además de los gráficos 2D, también puede crear gráficos interactivos en 3D utilizando la biblioteca de Plotly. Por ejemplo, para ver gráfica 3D para total_billtipsizecolumnas, ejecute el siguiente script.
dataset2 = dataset[["total_bill", "tip", "size"]]  
data = dataset2.iplot(kind='surface', colorscale='rdylbu')  
En la salida puede ver el gráfico 3D, puede moverlo, darle la vuelta, y acercar y alejar el gráfico.
Salida:
En esta sección, vimos algunos de los gráficos interactivos más utilizados que se ofrecen en Plotly. En la siguiente sección, veremos cómo se puede utilizar la biblioteca Plotly para trazar datos geográficos.

Parcela para parcelas geográficas

Para dibujar parcelas geográficas con Plotly, usaremos Choropleth Maps. Los mapas de coropletas son tipos especiales de diagramas de trazado que se utilizan para trazar datos geográficos. La documentación detallada sobre cómo usar los mapas de coropletas está disponible aquí .
En esta sección veremos, con la ayuda de ejemplos, cómo dibujar mapas geográficos para Estados Unidos y para todo el mundo. Pero antes de que realmente escribamos el código para trazar los gráficos geográficos, primero importemos las bibliotecas deseadas.
import plotly.plotly as py  
import plotly.graph_objs as go  
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

init_notebook_mode(connected=True)  
import pandas as pd  

Mapas geográficos de los Estados Unidos

Hay cuatro pasos para dibujar mapas geográficos utilizando Plotly.
Paso 1: Crear un diccionario de datos
El primer paso es crear un diccionario de datos que realmente contenga los datos que desea mostrar en el mapa. Para hacer esto, ejecute el siguiente script, que explicaré línea por línea después de eso.
map_data = dict(type='choropleth',  
            locations=['MI', 'CO', 'FL', 'IN'],
            locationmode='USA-states',
            colorscale='Portland',
            text=['Michigan', 'Colorado', 'Florida', 'Indiana'],
            z=[1.0,2.0,3.0,4.0],
            colorbar=dict(title="USA States")
           )
Debe especificar valores para varias claves en el diccionario de datos. Son los siguientes:
  1. type: Ya que estamos usando mapas de coropletas, el tipo siempre será choropleth.
  2. locations: Aquí debemos pasar las abreviaturas de los estados que queremos mostrar en nuestro mapa. Se mostrarán cuatro estados en nuestro mapa: 'Michigan (MI)', 'Colorado (CO)', 'Florida (FL),' Indiana (IN) '
  3. locationmodeserá USA-stateya que solo estamos mostrando el mapa para los Estados Unidos.
  4. colorscale: Esta tecla se utiliza para especificar el color de la trama. Consulte la documentación para más opciones de color.
  5. text: Contiene una lista de cadenas que se mostrarán cuando el mouse se desplace sobre la ubicación del estado.
  6. La zclave contiene una lista de valores numéricos que se mostrarán cuando el mouse se desplace sobre la ubicación del estado.
  7. colorbares un diccionario Para la titleclave, puede especificar el texto que se mostrará en la barra de color.
Paso 2: Crear un diseño
Una vez que haya creado un diccionario de datos, el siguiente paso es crear el diccionario de diseño. El diccionario de diseño para EE. UU. Es simple como se muestra en el siguiente script.
map_layout = dict(geo = {'scope':'usa'})  
El diccionario lleva otro diccionario llamado geoPasamos el valor "usa" para la scopeclave ya que nuestro mapa solo se limita a EE. UU.
Paso 3: Crear objeto gráfico
Si nos fijamos en la sección donde importamos las bibliotecas, importamos la plotly.graph_objsclase. El tercer paso es crear un objeto de este gráfico. Para hacerlo necesitamos llamar a la Figurefunción desde el objeto. El objeto toma dos parámetros: datalayoutPasaremos nuestro diccionario de datos al primer parámetro y el diccionario de diseño al segundo parámetro, como se muestra a continuación:
map_actual = go.Figure(data=[map_data], layout=map_layout)  
Paso 4: Llamar al método iplot ()
El último paso es llamar a la iplot()función y pasarle el objeto gráfico que creamos en el tercer paso como se muestra a continuación:
iplot(map_actual)  
En la salida, verá el gráfico geográfico de cuatro estados de EE. UU. Puede ver que el resto del estado no ha sido coloreado ya que no especificamos ninguna información con respecto a esos estados. Si pasa el mouse sobre los estados de color, verá los valores correspondientes de las teclas textzque especificamos cuando creamos nuestro diccionario de datos.

Mapas geográficos para los Estados Unidos utilizando CSV

Ahora tenemos una idea básica de cómo podemos crear parcelas geográficas utilizando los mapas de Plotly y choropleth. Ahora vamos a crear un mapa más complejo. Veremos cómo podemos usar los datos de un archivo CSV para crear un gráfico geográfico. Crearemos un mapa geográfico que mostrará el PIB per cápita de todos los estados de los Estados Unidos.
El conjunto de datos
El conjunto de datos de esta sección se puede descargar desde este enlace Kaggle , que viene en formato CSV. He cambiado el nombre del archivo para facilitar la lectura.
La siguiente secuencia de comandos importa el conjunto de datos e imprime sus primeras cinco filas en la consola.
df = pd.read_csv(r'E:/state_gdp.csv')  
df.head()  
La salida se ve así:
El conjunto de datos contiene los nombres de los estados en los Estados Unidos en la Areacolumna. El conjunto de datos también contiene el PIB per cápita de los cinco años de 2013 a 2017. Trazaremos los datos para el año 2017.
Un problema con el conjunto de datos es que contiene nombres completos de los estados, mientras que los mapas de coropletas aceptan la abreviatura de los nombres de los estados. Lo primero que debemos hacer es agregar una columna a nuestro conjunto de datos que contenga las abreviaturas de los nombres de los estados.
Una forma de hacer esto es crear un diccionario para los nombres de estado y sus abreviaturas y luego crear una columna que contenga valores abreviados de ese diccionario. La siguiente secuencia de comandos crea un diccionario donde las claves son los nombres de estado completos y los valores son las abreviaturas de estado correspondientes:
us_state_abbrev = {  
    'Alabama': 'AL',
    'Alaska': 'AK',
    'Arizona': 'AZ',
    'Arkansas': 'AR',
    'California': 'CA',
    'Colorado': 'CO',
    'Connecticut': 'CT',
    'Delaware': 'DE',
    'Florida': 'FL',
    'Georgia': 'GA',
    'Hawaii': 'HI',
    'Idaho': 'ID',
    'Illinois': 'IL',
    'Indiana': 'IN',
    'Iowa': 'IA',
    'Kansas': 'KS',
    'Kentucky': 'KY',
    'Louisiana': 'LA',
    'Maine': 'ME',
    'Maryland': 'MD',
    'Massachusetts': 'MA',
    'Michigan': 'MI',
    'Minnesota': 'MN',
    'Mississippi': 'MS',
    'Missouri': 'MO',
    'Montana': 'MT',
    'Nebraska': 'NE',
    'Nevada': 'NV',
    'New Hampshire': 'NH',
    'New Jersey': 'NJ',
    'New Mexico': 'NM',
    'New York': 'NY',
    'North Carolina': 'NC',
    'North Dakota': 'ND',
    'Ohio': 'OH',
    'Oklahoma': 'OK',
    'Oregon': 'OR',
    'Pennsylvania': 'PA',
    'Rhode Island': 'RI',
    'South Carolina': 'SC',
    'South Dakota': 'SD',
    'Tennessee': 'TN',
    'Texas': 'TX',
    'Utah': 'UT',
    'Vermont': 'VT',
    'Virginia': 'VA',
    'Washington': 'WA',
    'West Virginia': 'WV',
    'Wisconsin': 'WI',
    'Wyoming': 'WY',
}
El siguiente paso es agregar una columna en el conjunto de datos que contiene abreviaturas. Podemos hacerlo asignando los valores de la Areacolumna a las claves del us_state_abbrevdiccionario. Los valores correspondientes se pueden agregar a la columna de abreviatura recién creada como se muestra a continuación:
df['abbrev'] = df['Area'].map(us_state_abbrev)  
Ahora, si vuelve a imprimir la parte superior del marco de datos utilizando la head()función, verá la abbrevcolumna recién creada , como se muestra a continuación:
df.head()  
La salida se ve así:
Puedes ver las abreviaturas del estado en la abbrevcolumna. Es importante mencionar que la Areacolumna también tiene valores para todo el país. Sin embargo, el país tendrá una abreviatura correspondiente de NaN en la abbrevcolumna y, por lo tanto, se ignorará al trazar la gráfica.
Ahora que hemos preprocesado nuestros datos, los siguientes pasos son sencillos. Primero, crearemos un diccionario de datos que contenga valores de nuestro conjunto de datos, como se muestra a continuación:
map_data = dict(type='choropleth',  
            locations=df['abbrev'],
            locationmode='USA-states',
            colorscale='Reds',
            text=df['Area'],
            marker=dict(line=dict(color='rgb(255,0,0)', width=2)),
            z=df['2017'],
            colorbar=dict(title="GDP Per Capita - 2017")
           )
Puede verlo en el script anterior, para la locationsclave que estamos pasando la abbrevcolumna de nuestro conjunto de datos. Esto significa que la trama geográfica para todos los estados de los Estados Unidos se imprimirá en la pantalla.
De manera similar, para la textclave estamos pasando la columna "Área" que contiene el nombre completo del estado. Finalmente, para la zclave, aprobamos el PIB per cápita para el año 2017.
También es importante mencionar que tenemos una nueva clave aquí, es decir markerEsto se utiliza para crear un borde entre diferentes estados. Un valor RGB de 255,0,0significa que el borde será rojo. Un ancho de 2 especifica que el ancho del borde es de 2 píxeles.
El siguiente paso es crear el diseño de nuestro mapa. El siguiente script hace eso:
map_layout = dict(title='USA States GDP Per Capita - 2017',  
              geo=dict(scope='usa',
                         showlakes=True,
                         lakecolor='rgb(85,173,240)')
             )
Tenga en cuenta que en la secuencia de comandos anterior se pasa Truela showlakesclave, lo que significa que los lagos se mostrarán en el mapa y su color será azul claro según lo especificado por el valor RGB de rgb(85,173,240).
Finalmente, debe crear el objeto gráfico y pasarle los diccionarios de datos y diseño, como hicimos en la sección anterior. Mira el siguiente script:
map_actual = go.Figure(data=[map_data], layout=map_layout)  
Como último paso, debemos llamar al iplot()método y pasarlo a nuestro objeto gráfico recién creado:
iplot(map_actual)  
Una vez que ejecute el script anterior, verá un mapa de Estados Unidos con el PIB per cápita. Los estados de color más claro tienen un PIB menor que los de color más oscuro.

Mapas geográficos para el mundo

En las secciones anteriores, vimos mapas gráficos para los Estados Unidos. En esta sección, veremos cómo trazar mapas geográficos para el mundo. El proceso sigue siendo más o menos similar. Como primer paso, crearemos un diccionario de datos, seguido del diccionario de diseño y el objeto gráfico. Finalmente, usaremos la iplot()función para trazar la gráfica.
El conjunto de datos
El conjunto de datos que vamos a utilizar contiene una población mundial del mundo para los años 1960-2016. Estaremos trazando un mapa geográfico del mundo que muestre la población de cada país para el año 2016.
El conjunto de datos se puede descargar desde este enlace de Kaggle . El conjunto de datos se descargará en formato CSV.
La siguiente secuencia de comandos importa el conjunto de datos y muestra sus primeras cinco filas usando el head()método.
df = pd.read_csv(r'E:/world_pop.csv')  
df.head()  
La siguiente imagen contiene la captura de pantalla de la salida:
Vamos a crear un diccionario de datos que almacenará la información sobre los datos que queremos trazar a partir del conjunto de datos de población que acabamos de cargar.
map_data = dict(  
        type='choropleth',
        locations=df['Country Code'],
        z=df['2016'],
        text=df['Country'],
        colorbar={'title': 'World Population 2016'},
      )
Desde el script anterior, puede ver que el único cambio que hicimos está en la locationsclave; ahora estamos pasando el "Código de país" en lugar de las abreviaturas para el estado. Este es un requisito obligatorio para trazar la trama geográfica del mundo. Para la textclave, pasamos los valores de la columna "País" que contiene el nombre completo del país. De manera similar, para la zclave, pasamos los valores de la columna "2016" porque esta es la columna que contiene los valores de población para el año 2016.
El siguiente paso es crear un diccionario de diseño. Mira el siguiente script:
map_layout = dict(  
    title='World Population 2016',
    geo=dict(showframe=False)
)
En el diseño, el único parámetro que cambiamos es la showFrameclave del geodiccionario. Si esta clave se establece en False, el gráfico resultante no contiene un límite.
A continuación, necesitamos crear un objeto de gráfico Plotly y pasarle los diccionarios de datos y diseño que creamos, como se muestra a continuación:
map_actual = go.Figure(data=[map_data], layout=map_layout)  
Como último paso, debemos llamar a la iplot()función y pasarle el objeto gráfico que acabamos de crear.
La salida debería verse así:
En la salida, puede ver el mapa de todo el mundo junto con las densidades de población. Puede ver que el mapa de India y China es más oscuro en comparación con los otros países, ya que están mucho más poblados en comparación con los países europeos que están menos poblados. Si pasa el mouse sobre cualquier país, debería ver el nombre del país junto con la población total.

Conclusión

Plotly es una biblioteca de Python extremadamente útil para la visualización interactiva de datos. En este artículo, vimos cómo podemos usar Plotly para trazar gráficos básicos, como diagramas de dispersión, gráficos de líneas, histogramas y gráficos 3D básicos. También vimos cómo se puede utilizar Plotly para trazar parcelas geográficas utilizando el mapa de coropletas. Como ejemplo, trazamos parcelas geográficas para Estados Unidos y para todo el mundo.
Le sugiero que explore la biblioteca de coropletas y trate de practicar la creación de algunas parcelas más geográficas, ya que hay muchas características para explorar. La documentación detallada de los mapas de choropleth está disponible en este enlace: https://plot.ly/python/choropleth-maps/ .

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas