Ich habe den folgenden Code, der die folgende Abbildung erzeugt
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'])
Ich habe die Daten mit Hexbins grafisch dargestellt, wie unten angegeben
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()
Ich möchte die Größe der Sechsecke basierend auf der Dichte der Punkte ändern, die in dem Bereich eingezeichnet sind, den ein Sechseck abdeckt. Zum Beispiel sind die Sechsecke unten links (wo die Punkte kompakt sind) größer als die Sechsecke überall sonst (wo die Punkte spärlich sind). Gibt es eine Möglichkeit, dies zu tun?
Bearbeiten: Ich habe diese Lösung ausprobiert , kann aber nicht herausfinden, wie die Hexen basierend auf df ['Bin'] eingefärbt oder wie die minimale und maximale Hex-Größe eingestellt werden.
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'],
, wird nicht die Dichte angezeigt, sondern die Menge in der Bin
Spalte. Die Handlung ist also korrekt. Sie können C
Argumente weglassen und die Größen basierend auf der Dichte ermitteln.
val/ma
im Code bestimmt. Sie können es durch alles ersetzen, was Sie für geeignet halten. Die Farben werden über eingestellt pc.set_array(values)
; Sie können etwas anderes als values
natürlich verwenden.