matplotlib 中的轮廓标签填充轮廓错误?

Posted

技术标签:

【中文标题】matplotlib 中的轮廓标签填充轮廓错误?【英文标题】:Contour labels in matplotlib filled contours wrong? 【发布时间】:2022-01-24 00:08:44 【问题描述】:

在下面的示例中,我想将轮廓标签添加到填充轮廓。我对常规轮廓做同样的事情,结果似乎是正确的。然而,对于填充的轮廓,标签是关闭的。这是一个错误还是我误解了什么?

import matplotlib.pyplot as plt
import numpy

X,Z = numpy.meshgrid(range(5),range(5))
V = numpy.zeros([len(X),len(X[0])])
for kx in range(len(X[0])):
    for kz in range(len(X)):
        V[kz][kx] = X[kx][kz]


fig = plt.figure(figsize=(12,8))

ax1 = fig.add_subplot(121)
CS1 = ax1.contour(X,Z,V,range(5))
ax1.clabel(CS1,fontsize=16,colors='k')
cb1 = fig.colorbar(CS1)

ax2 = fig.add_subplot(122)
CS2 = ax2.contourf(X,Z,V,range(5))
ax2.clabel(CS2,fontsize=16,colors='k')
cb2 = fig.colorbar(CS2)

fig.savefig('contour')

【问题讨论】:

认为 clabel 仅适用于 contour,不适用于 contourf。来自文档:“将标签添加到 cs 中的线条轮廓,其中 cs 是轮廓返回的 ContourSet 对象” 谢谢,大概就是这样。只要颜色条正确,我就可以忍受。 【参考方案1】:

最近的 Matplotlib 版本在这方面有所改进。我在 matplotlib 2.0.2 上运行了你的代码,得到了以下图表:

import matplotlib.pyplot as plt
import numpy

X,Z = numpy.meshgrid(range(5),range(5))
V = numpy.zeros([len(X),len(X[0])])
for kx in range(len(X[0])):
    for kz in range(len(X)):
        V[kz][kx] = X[kx][kz]


fig = plt.figure(figsize=(12,8))

ax1 = fig.add_subplot(121)
CS1 = ax1.contour(X,Z,V,range(5))
ax1.clabel(CS1,fontsize=16,colors='k')
cb1 = fig.colorbar(CS1)

ax2 = fig.add_subplot(122)
CS2 = ax2.contourf(X,Z,V,range(5))
ax2.clabel(CS2,fontsize=16,colors='k')
cb2 = fig.colorbar(CS2)

fig.savefig('contour')

这当然看起来更好,但并不能完全解决问题。我们希望填充等高线图上的标签看起来像等高线图中的标签。现在正如汤姆指出的那样,我们不能轻易做到这一点,因为clabel 被设计用于contour 而不是contourf。有一个不那么整洁的解决方法。我们可以做的是首先创建contour 图,其标签可以通过clabel 函数轻松操作,然后我们使用contourf 填充此图。

import matplotlib.pyplot as plt
import numpy

X,Z = numpy.meshgrid(range(5),range(5))
V = numpy.zeros([len(X),len(X[0])])
for kx in range(len(X[0])):
    for kz in range(len(X)):
        V[kz][kx] = X[kx][kz]
fig = plt.figure(figsize=(12,8))

ax1 = fig.add_subplot(121)
CS1 = ax1.contour(X,Z,V,range(5))
ax1.clabel(CS1,fontsize=16,colors='k')
cb1 = fig.colorbar(CS1)

ax2 = fig.add_subplot(122)
CS2 = ax2.contour(X,Z,V,range(5)) # Creating the contour plot
ax2.clabel(CS2,fontsize=16,colors='k')
CS3 = ax2.contourf(X,Z,V,range(5)) # Creating another filled contour plot on top
cb2 = fig.colorbar(CS3) # Display colorbar for filled contour plot

fig.savefig('contour')

我仍然希望这些标签位于情节的不同区域的中心,但我找不到这样做的方法。

【讨论】:

以上是关于matplotlib 中的轮廓标签填充轮廓错误?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 中的曲面和 3d 轮廓

Matplotlib 中的散点图轮廓

Geopandas和Matplotlib,我如何绘制没有任何形状的轮廓?

Matplotlib 直方图或 Seaborn 分布图的 bin 上没有轮廓

数据增强——python opencv 找出图像中的最大轮廓并填充(生成mask)——python 轮廓内部填充

SwiftUI:如何将图像更新为 TabView 中的填充/轮廓