我有以下代码,产生下图
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我用提议的解决方案中的工作更新了帖子
—
Ethan
使用时,
—
ImportanceOfBeingErnest
C=df['Bin'],
它不会显示密度,而是显示Bin
列中的数量。因此,情节是正确的。您可以省略C
参数,并根据密度获取尺寸。
@ImportanceOfBeingErnest好的,知道了。如何用df ['Bin']着色十六进制?我还希望能够将六边形的最小大小更改为更大一些,这可能吗?
—
伊桑
大小由
—
ImportanceOfBeingErnest
val/ma
代码中的比率确定。您可以将其替换为任何合适的东西。颜色通过pc.set_array(values)
; values
当然可以使用其他方式。