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()
python
matplotlib
Ethan
fuente
fuente
C=df['Bin'],
no mostrará la densidad, sino la cantidad que está en laBin
columna. Entonces la trama es correcta. Puede omitirC
argumentos y obtener los tamaños en función de la densidad.val/ma
en el código. Puede reemplazarlo con lo que considere adecuado. Los colores se establecen a través depc.set_array(values)
; puedes usar algo que no sea,values
por supuesto.Respuestas:
Es posible que desee pasar algún tiempo en comprender el mapeo de colores.
fuente
df['Bin']
columna?df['Bin']
columna, por lo que los hexágonos inferiores izquierdos son azules y los otros son rojos