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()
python
matplotlib
Ethan
fonte
fonte
C=df['Bin'],
, não mostra a densidade, mas a quantidade que está naBin
coluna. Portanto, o enredo está correto. Você pode deixar de fora oC
argumento e obter os tamanhos com base na densidade.val/ma
no código. Você pode substituí-lo pelo que achar adequado. As cores são definidas viapc.set_array(values)
; você pode usar algo diferente, évalues
claro.Respostas:
Você pode gastar algum tempo na compreensão do mapeamento de cores.
fonte
df['Bin']
coluna?df['Bin']
coluna, para que os hexágonos inferiores à esquerda sejam azuis e os outros sejam vermelhos