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()
python
matplotlib
Ethan
la source
la source
C=df['Bin'],
, la densité ne s'affiche pas, mais la quantité qui se trouve dans laBin
colonne. L'intrigue est donc correcte. Vous pouvez laisser de côté l'C
argument et obtenir les tailles en fonction de la densité.val/ma
dans le code. Vous pouvez le remplacer par tout ce que vous trouvez approprié. Les couleurs sont définies viapc.set_array(values)
; vous pouvez utiliser autre chose quevalues
bien sûr.Réponses:
Vous voudrez peut-être passer un certain temps à comprendre le mappage des couleurs.
la source
df['Bin']
colonne?df['Bin']
colonne, donc les hexs en bas à gauche sont bleus et les autres sont rouges