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()
python
matplotlib
Ethan
quelle
quelle
C=df['Bin'],
, wird nicht die Dichte angezeigt, sondern die Menge in derBin
Spalte. Die Handlung ist also korrekt. Sie könnenC
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 eingestelltpc.set_array(values)
; Sie können etwas anderes alsvalues
natürlich verwenden.Antworten:
Möglicherweise möchten Sie einige Zeit damit verbringen, die Farbzuordnung zu verstehen.
quelle
df['Bin']
Spalte ändern ?df['Bin']
Spalte basiert , also sind die unteren linken Sechsecke blau und die anderen rot