J'ai le code suivant qui produit la figure suivante
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'])
J'ai représenté graphiquement les données à l'aide d'hexbins, comme indiqué ci-dessous
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()
Je voudrais changer la taille des hexagones en fonction de la densité des points tracés dans la zone couverte par un hexagone. Par exemple, les hexagones en bas à gauche (où les points sont compacts) seront plus grands que les hexagones partout ailleurs (où les points sont clairsemés). Y a-t-il un moyen de faire cela?
Edit: J'ai essayé cette solution , mais je ne peux pas comprendre comment colorer les hexs en fonction de df ['Bin'], ou comment définir la taille hexadécimale min et max.
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()
C=df['Bin'],, la densité ne s'affiche pas, mais la quantité qui se trouve dans la Bincolonne. L'intrigue est donc correcte. Vous pouvez laisser de côté l' Cargument et obtenir les tailles en fonction de la densité.
val/madans le code. Vous pouvez le remplacer par tout ce que vous trouvez approprié. Les couleurs sont définies via pc.set_array(values); vous pouvez utiliser autre chose que valuesbien sûr.





