我使用contourf绘制matplotlib.pyplot图。现在,我想有一条水平线(或者也可以使用ax.vspan之类的东西)并在y = 0处进行条件着色。我将向您展示我所拥有的以及我想要获得的。我想用一个数组来做,假设landsurface代表陆地,海洋或冰。该数组由1(陆地),2(海洋)或3(冰)填充,并具有len(locs)(即x轴)。

这是情节代码:

plt.figure()
ax=plt.axes()
clev=np.arange(0.,50.,.5)
plt.contourf(locs,height-surfaceheight,var,clev,extend='max')
plt.xlabel('Location')
plt.ylabel('Height above ground level [m]')
cbar = plt.colorbar()
cbar.ax.set_ylabel('o3 mixing ratio [ppb]')
plt.show()


这是我到目前为止所拥有的:

python - 添加带有条件着色的水平线-LMLPHP

这就是我要的:

python - 添加带有条件着色的水平线-LMLPHP

提前谢谢了!

最佳答案

介绍

我将使用line collection

python - 添加带有条件着色的水平线-LMLPHP
因为我没有原始数据,所以我使用简单的正弦曲线伪造了一些数据,并在基线上绘制了与曲线的小,中,高值相对应的颜色代码



通常,我们需要显式导入LineCollection

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import LineCollection


只是为了绘制一些东西,正弦曲线(x r

x = np.linspace(0, 50, 101)
y = np.sin(0.3*x)


从曲线值(对应于您的表面类型)到LineCollection颜色的颜色编码,请注意,LineCollection要求将颜色指定为RGBA元组,但是我看到了使用颜色字符串的示例,ba!

# 1 when near min, 2 when near 0, 3 when near max
z = np.where(y<-0.5, 1, np.where(y<+0.5, 2, 3))

col_d = {1:(0.4, 0.4, 1.0, 1), # blue, near min
         2:(0.4, 1.0, 0.4, 1), # green, near zero
         3:(1.0, 0.4, 0.4, 1)} # red, near max
# prepare the list of colors
colors = [col_d[n] for n in z]


在一个行集合中,我们需要一个段序列,在这里,我决定将编码行放置在y=0上,但是您只需在s上添加一个常数即可上下移动它。
我承认形成分段序列有点棘手...

# build the sequence of segments
s = np.zeros(101)
segments=np.array(list(zip(zip(x,x[1:]),zip(s,s[1:])))).transpose((0,2,1))
# and fill the LineCollection
lc = LineCollection(segments, colors=colors, linewidths=5,
                    antialiaseds=0, # to prevent artifacts between lines
                    zorder=3        # to force drawing over the curve)                                                                 lc = LineCollection(segments, colors=colors, linewidths=5) # possibly add zorder=...


最后,我们把所有东西都放在画布上

# plot the function and the line collection
fig, ax = plt.subplots()
ax.plot(x,y)
ax.add_collection(lc)

关于python - 添加带有条件着色的水平线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56001070/

10-12 03:55