Tengo el siguiente código que produce la siguiente figura
import numpy as np
np.random.seed(3)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame()
df['X'] = list(np.random.randint(100, size=100)) + list(np.random.randint(30, size=100))
df['Y'] = list(np.random.randint(100, size=100)) + list(np.random.randint(30, size=100))
df['Bin'] = df.apply(lambda row: .1 if row['X'] < 30 and row['Y'] < 30 else .9, axis=1)
fig, ax = plt.subplots(figsize=(10,10))
plt.scatter(df['X'], df['Y'])
Graficé los datos usando hexbins, como se indica a continuación
from matplotlib import cm
fig, ax = plt.subplots(figsize=(10,10))
hexbin = ax.hexbin(df['X'], df['Y'], C=df['Bin'], gridsize=20, cmap= cm.get_cmap('RdYlBu_r'),edgecolors='black')
plt.show()
Me gustaría cambiar el tamaño de los hexágonos en función de la densidad de los puntos trazados en el área que cubre un hexágono. Por ejemplo, los hexágonos en la parte inferior izquierda (donde los puntos son compactos) serán más grandes que los hexágonos en cualquier otro lugar (donde los puntos son escasos). ¿Hay alguna forma de hacer esto?
Editar: probé esta solución , pero no puedo entender cómo colorear los hexes en función de df ['Bin'], o cómo establecer el tamaño de hex mínimo y máximo.
from matplotlib.collections import PatchCollection
from matplotlib.path import Path
from matplotlib.patches import PathPatch
fig, ax = plt.subplots(figsize=(10,10))
hexbin = ax.hexbin(df['X'], df['Y'], C=df['Bins'], gridsize=20, cmap= cm.get_cmap('RdYlBu_r'),edgecolors='black')
def sized_hexbin(ax,hc):
offsets = hc.get_offsets()
orgpath = hc.get_paths()[0]
verts = orgpath.vertices
values = hc.get_array()
ma = values.max()
patches = []
for offset,val in zip(offsets,values):
v1 = verts*val/ma+offset
path = Path(v1, orgpath.codes)
patch = PathPatch(path)
patches.append(patch)
pc = PatchCollection(patches, cmap=cm.get_cmap('RdYlBu_r'), edgecolors='black')
pc.set_array(values)
ax.add_collection(pc)
hc.remove()
sized_hexbin(ax,hexbin)
plt.show()
1
¿ Viste stackoverflow.com/questions/48844600/… ?
—
plasmon360
@ plasmon360 Actualicé la publicación con mi trabajo de la solución propuesta
—
Ethan
Cuando lo use
—
ImportanceOfBeingErnest
C=df['Bin'],
no mostrará la densidad, sino la cantidad que está en la Bin
columna. Entonces la trama es correcta. Puede omitir C
argumentos y obtener los tamaños en función de la densidad.
@ImportanceOfBeingErnest está bien, te tengo. ¿Cómo puedo colorear los hexes con df ['Bin']? También me gustaría poder cambiar el tamaño mínimo de los hexágonos para que sea un poco más grande, ¿es esto posible?
—
Ethan
El tamaño está determinado por la relación
—
ImportanceOfBeingErnest
val/ma
en el código. Puede reemplazarlo con lo que considere adecuado. Los colores se establecen a través de pc.set_array(values)
; puedes usar algo que no sea, values
por supuesto.