填充 matplotlib 等高线图

Fill a matplotlib contour plot

通过以下代码得到等高线图:

fig, ax = plt.subplots()
x = np.arange(431)
y = np.arange(225)
Y, X = np.meshgrid(y, x)
values = df["Appearance_percentage"].values
values2d = np.reshape(values, (431, 225))
ax.set_ylim(225, 0)

plt.style.use('seaborn-white')
ax.set_title('Mapa contour de probabilitat de trobar núvols')
plt.contour(X, Y, values2d, 30, cmap='RdGy')
plt.colorbar()
plt.savefig("contourmap.png")

我想知道是否可以填充线条之间的区域,使颜色条中没有空白,地图更吸引人。

我试过 df["Appearance_percentage_contourmap"] = round(df["Appearance_percentage"]),然后 values = df["Appearance_percentage_contourmap"].values,但我仍然获得了相同的地图,其中有很多白色区域。

只需将 plt.contour 替换为 plt.contourf,其中末尾的“f”表示“填充”。

这是一个例子:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.arange(100)
Y, X = np.meshgrid(y, x)
values = np.outer(x, y)

fig, ax = plt.subplots()
plt.contourf(X, Y, values, 30, cmap='RdGy')
plt.colorbar()

您可能还想强调轮廓线:

x = np.arange(100)
y = np.arange(100)
Y, X = np.meshgrid(y, x)
values = np.outer(x, y)

fig, ax = plt.subplots()
c1 = plt.contourf(X, Y, values, 30, cmap='RdGy')
c2 = plt.contour(X, Y, values, 30, cmap='Greys')
plt.colorbar(c1)

plt.contour() 创建一个 isoline 连接具有相等插值的所有位置。因此,它会搜索外观所在的地方,例如6% 并用一条线将它们连接起来。如果你设置 levels=30 将会绘制 30 条这样的线。 plt.contour() 做了很多努力来创建一个显示每行值的颜色条。如果您不想要这样的颜色条,您可以使用相同的值创建自定义颜色条。

您可以按如下方式创建自定义颜色条:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable

fig, ax = plt.subplots()
x = np.arange(431)
y = np.arange(225)
Y, X = np.meshgrid(y, x)
values = np.random.randn(431, 225).cumsum(axis=0).cumsum(axis=1).ravel()
values -= values.min()
values2d = np.reshape(values, (431, 225))
ax.set_ylim(225, 0)

plt.style.use('seaborn-white')
ax.set_title('Mapa contour de probabilitat de trobar núvols')
plt.contour(X, Y, values2d, 30, cmap='RdGy')
sm = ScalarMappable(norm=plt.Normalize(values.min(), values.max()), cmap='RdGy')
plt.colorbar(sm)
plt.show()

PS:请不要对值进行四舍五入(如 df["Appearance_percentage_contourmap"] = round(df["Appearance_percentage"])),因为这会造成人为的错误。