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 Bincolumna. Entonces la trama es correcta. Puede omitir Cargumentos 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/maen 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, valuespor supuesto.





