У мене є такий код, який дає наступну фігуру
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'])
Я схопив дані за допомогою гексбінів, як зазначено нижче
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()
Я хотів би змінити розмір шестикутників, виходячи з щільності точок, нанесених у зону, яку покриває шестикутник. Наприклад, шестикутники в лівій нижній частині (де точки компактні) будуть більшими, ніж шестикутники скрізь (де точки розріджені). Чи є спосіб це зробити?
Редагувати: я спробував це рішення , але не можу зрозуміти, як пофарбувати шістнадцятки на основі df ['Bin'], або як встановити розмір min та max hex.
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()
1
Ви бачили stackoverflow.com/questions/48844600/… ?
—
plazmon360
@ plasmon360 Я оновив пост своєю роботою з запропонованого рішення
—
Етан
При використанні
—
ВажливістьOfBeingErnest
C=df['Bin'],
він не відображатиме щільність, а скоріше кількість, що знаходиться у Bin
стовпці. Тож сюжет правильний. Ви можете залишати C
аргументи та отримувати розміри залежно від щільності.
@ImportanceOfBeingErnest добре, gotcha. Як я можу забарвити шестикутники df ['Bin']? Я також хотів би мати можливість змінити мінімальний розмір шестикутників, щоб бути трохи більшим, чи це можливо?
—
Етан
Розмір визначається співвідношенням
—
ВажливістьOfBeingErnest
val/ma
у коді. Ви можете замінити його тим, що вважаєте за потрібне. Кольори встановлюються через pc.set_array(values)
; Ви можете використовувати щось інше, ніж values
звичайно.