Matplotlib 填充区域

2 投票
1 回答
1634 浏览
提问于 2025-04-18 01:31

我想用填充颜色的方式来替代图中的点,也就是把这些点换成一条连续的颜色带。请问我该怎么做呢?

enter image description here

下面是相关的代码(这些点可以看作是三组实验数据,实际上它们就是这样的)

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from pylab import figure, show

plt.rc('text', usetex=True)
plt.rc('font', family='serif')

fig = figure()
ax = fig.add_subplot(111)

p1, = ax.plot(x_124,y_124,'o')
p2, = ax.plot(x_125,y_125,'o')
p3, = ax.plot(x_126,y_126,'o')

xmax=max(x_124+x_125+x_126)
xmin=min(x_124+x_125+x_126)
ymax=max(y_124+y_125+y_126)
ymin=min(y_124+y_125+y_126)

plt.title('Escenario $m_{h}^{\mathrm{max}}$')

plt.ticklabel_format(style='sci',scilimits=(0,0),axis='both')

ax.xaxis.set_major_locator(MaxNLocator(12))
ax.yaxis.set_major_locator(MaxNLocator(12))
plt.xlim(0.96*xmin,1.04*xmax)
plt.ylim(0.96*ymin,1.04*ymax)

plt.legend(['$m_h$ = 124 GeV','$m_h$ = 125 GeV','$m_h$ = 126 GeV'],numpoints=1,loc=0)

plt.xlabel('M3SQ / GeV')
plt.ylabel('M3SU / GeV')

ax.grid()
show()

1 个回答

2

我知道这个答案不够完整,应该有更优雅的方法来解决这个问题。不过,至少对于你图的右上角,这个方法可以快速解决问题。

对于每一个 m_h,

  • 遍历所有的 x 值,
  • 找出每个 x 值对应的最高和最低的 y 值(针对这个 m_h)。
  • 完成所有 x 值后,你就能得到使用 matplotlib 中的 fill_between 函数所需的三个列表。

用这种方法,当然你还得决定如何连接不同的“连续颜色带”,比如右上角的红色和绿色。

不过,考虑到你图中“点”的数量,这个方法不适用于中间那一组点(大概是从 y=1.6 到 x=1.6 的那些点)。这是因为你不能仅用一系列一维的点来构建一个颜色带。你需要更多的样本。

撰写回答