ฉันมีรหัสต่อไปนี้ซึ่งก่อให้เกิดรูปต่อไปนี้
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'] หรือวิธีตั้งขนาด 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/หรือไม่?
—
plasmon360
@ plasmon360 ฉันอัปเดตโพสต์ด้วยงานของฉันจากโซลูชันที่เสนอ
—
Ethan
เมื่อคุณใช้
—
ImportanceOfBeingErnest
C=df['Bin'],
มันจะไม่แสดงความหนาแน่น แต่เป็นปริมาณที่อยู่ในBin
คอลัมน์ ดังนั้นพล็อตนั้นถูกต้อง คุณสามารถออกจากการC
โต้แย้งและรับขนาดตามความหนาแน่น
@ImportanceOfBeingErnest ไม่เป็นไร gotcha ฉันจะทำสีฐานสิบหกด้วย df ['Bin'] ได้อย่างไร ฉันต้องการที่จะสามารถเปลี่ยนขนาด min ของ hexagons ให้ใหญ่ขึ้นอีกเล็กน้อยเป็นไปได้หรือไม่
—
อีธาน
ขนาดจะถูกกำหนดโดยอัตราส่วน
—
ImportanceOfBeingErnest
val/ma
ในรหัส คุณสามารถแทนที่ด้วยสิ่งที่คุณเห็นว่าเหมาะสม สีถูกตั้งค่าผ่านpc.set_array(values)
; คุณสามารถใช้สิ่งอื่นนอกเหนือvalues
จากแน่นอน