У меня есть следующий код, который производит следующий рисунок
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'])
Я получил данные с помощью hexbins, как указано ниже
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'], или как установить минимальный и максимальный размер гекса.
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/… ?
—
Plasmon360
@ plasmon360 Я обновил пост своей работой из предложенного решения
—
Итан,
При использовании
—
ImportanceOfBeingErnest
C=df['Bin'],
он будет отображать не плотность, а количество, которое находится в Bin
столбце. Так что сюжет правильный. Вы можете опустить C
аргумент и получить размеры в зависимости от плотности.
@ImportanceOfBeingErnest хорошо, понял. Как я могу раскрасить гексы с помощью df ['Bin']? Я также хотел бы иметь возможность изменить минимальный размер шестиугольников, чтобы он был немного больше, возможно ли это?
—
Итан
Размер определяется соотношением
—
ImportanceOfBeingErnest
val/ma
в коде. Вы можете заменить его всем, что считаете подходящим. Цвета задаются через pc.set_array(values)
; Вы можете использовать что-то, кроме, values
конечно.