Mpltern三元hexbin/tribin图与散点图数据不匹配问题求助
问题根源
你的代码存在两个核心问题导致分箱与散点位置不匹配:
- 参数传递错误:mpltern的
hexbin函数仅需传入三元坐标的前两个分量(如t和l),第三个参数是可选的C(用于分箱着色的数值),而非第三个坐标r。你错误地将z1作为第三个参数传入,导致hexbin把z1当成着色值,而非坐标的一部分。 - 坐标未归一化:mpltern的三元坐标系要求三个坐标之和为1,
scatter函数会自动对非归一化的坐标做归一化处理,但hexbin不会。你的原始数据x1+y1+z1远小于1,散点图显示的是归一化后的位置,而hexbin使用的是原始未归一化的x1和y1,两者位置自然不匹配。
解决方案
先手动将三元数据归一化,确保三个分量之和为1,再正确调用hexbin函数:
修改后的代码
import numpy as np import matplotlib.pyplot as plt import mpltern x1 = np.array([0.15921388, 0.08445221, 0.13533423, 0.24502292, 0.14315514, 0.14378208, 0.0905937, 0.13808297, 0.26968698, 0.21460839, 0.19753381, 0.39154374, 0.2944789, 0.07735608, 0.02421507, 0.15890793, 0.08938327, 0.24203739, 0.05313224, 0.21074095, 0.02182935, 0.12656056, 0.23842347, 0.10877017, 0.03686441, 0.1083744, 0.30224614, 0.11176163, 0.01040438, 0.04633287, 0.04814788, 0.25626729, 0.27124984, 0.29228856, 0.20128026, 0.15314417, 0.03423973, 0.18703571, 0.50320241, 0.15545899, 0.22140219, 0.15753903, 0.23184372, 0.17803931, 0.18755939, 0.2624067, 0.1440943, 0.02479316, 0.21877641, 0.07915115]) y1 = np.array([0.03095992, 0.02485942, 0.00461012, 0.05415974, 0.00641977, 0.0075788, 0.0134618, 0.00568952, 0.03612804, 0.00746038, 0.00676633, 0.01774103, 0.01147181, 0.03701774, 0.00521707, 0.01513134, 0.01096237, 0.00535175, 0.01933876, 0.01067182, 0.00671298, 0.01124348, 0.02042159, 0.01474262, 0.06801241, 0.04752748, 0.00732321, 0.01774961, 0.02490424, 0.00562966, 0.01450898, 0.00662498, 0.01217311, 0.00875899, 0.00708021, 0.01435426, 0.01067889, 0.01273073, 0.01441814, 0.01066786, 0.01154695, 0.01158576, 0.01315231, 0.00783604, 0.00777104, 0.00740172, 0.0158397, 0.14350677, 0.00932028, 0.02426256]) z1 = np.array([0.00589924, 0.0057058, 0.00533584, 0.01385247, 0.00517615, 0.01156184, 0.01189617, 0.00616605, 0.02759438, 0.01694141, 0.00507685, 0.01977934, 0.01012728, 0.01097368, 0.00841697, 0.01136306, 0.00441427, 0.0087905, 0.09940766, 0.01501123, 0.00605385, 0.01732032, 0.00804425, 0.0076006, 0.00622514, 0.02512553, 0.0088141, 0.01543971, 0.01515265, 0.00890357, 0.0410794, 0.00780079, 0.01436306, 0.03417111, 0.01696163, 0.01495142, 0.09817156, 0.01281905, 0.01656083, 0.01404464, 0.00711828, 0.00759094, 0.00899801, 0.02024836, 0.00412182, 0.00507957, 0.00991598, 0.00700659, 0.00667614, 0.02504912]) # 归一化三元坐标,确保t+l+r=1 total = x1 + y1 + z1 t = x1 / total l = y1 / total r = z1 / total ax = plt.subplot(projection="ternary") # 散点图使用归一化后的坐标 ax.scatter(t, l, r, color="C3", marker="x") # hexbin只传前两个归一化坐标,若需要用z1着色则指定C参数 ax.hexbin(t, l, C=z1, edgecolors="none", gridsize=20, vmax=5, zorder=0.0) plt.show()
关键说明
- 归一化步骤是核心:将原始数据按总和缩放,保证三个分量之和为1,匹配mpltern三元坐标系的要求。
hexbin的正确调用:仅传入前两个归一化后的坐标分量,第三个坐标由t+l+r=1自动推导;若需要根据某个数值(如原始z1)为分箱着色,通过C参数传入即可。
内容的提问来源于stack exchange,提问作者Duncan Moseley
相关产品推荐
相关产品推荐

