Eu tenho o seguinte código que produz a figura a seguir
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'])
Eu gráfico os dados usando hexbins, como observado abaixo
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()
Gostaria de alterar o tamanho dos hexágonos com base na densidade dos pontos plotados na área que um hexágono cobre. Por exemplo, os hexágonos no canto inferior esquerdo (onde os pontos são compactos) serão maiores que os hexágonos em qualquer outro lugar (onde os pontos são escassos). Existe uma maneira de fazer isso?
Edit: Eu tentei esta solução , mas não consigo descobrir como colorir os hexágonos com base em df ['Bin'], ou como definir o tamanho hexadecimal mínimo e máximo.
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()
11
Você viu stackoverflow.com/questions/48844600/… ?
—
plasmon360
@ plasmon360 Atualizei o post com meu trabalho a partir da solução proposta
—
Ethan
Quando você o usa
—
ImportanceOfBeingErnest
C=df['Bin'],
, não mostra a densidade, mas a quantidade que está na Bin
coluna. Portanto, o enredo está correto. Você pode deixar de fora o C
argumento e obter os tamanhos com base na densidade.
@ImportanceOfBeingErnest ok, entendi. Como posso colorir os hexágonos com o df ['Bin']? Eu também gostaria de poder alterar o tamanho mínimo dos hexágonos para ser um pouco maior, isso é possível?
—
Ethan
O tamanho é determinado pela proporção
—
ImportanceOfBeingErnest
val/ma
no código. Você pode substituí-lo pelo que achar adequado. As cores são definidas via pc.set_array(values)
; você pode usar algo diferente, é values
claro.