Matplotlib contourf复制线

2024-05-08 19:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个I(72x72)矩阵,它表示二维空间中的一条矩形线,我想用下面的matplotlib代码将其作为概率分布图的交点覆盖:

# let mass be a logarithmic scale of masses (length = 72)
# let velocities be a linear scale of velocities (length = 72)
# let distribution be a 2D probability distribution (72x72)
# let contour be a 72x72 identity matrix

import matplotlib
from matplotlib import pyplot as plot
from mpl_toolkits.mplot3d import Axes3D

fig = plot.figure()
plot.title(title)
plot.xlabel('Velocities (km/s)')
plot.ylabel('Mass (grams), 10^X')
plot.axis([0, 40, -6.65, -5.00])
levels = np.linspace(0, 0.0018, 25)

cs_dist = plot.contourf(
    mass, velocities, distribution, alpha=0.95, levels=levels
)
fig.colorbar(cs_dist, format="%.5f")

cs_shield = plot.contour(
    mass, velocities, contour, 1,
    levels=[0], colors='w', linestyles='solid'
)
plot.clabel(cs_shield, inline=True)

plot.show()

此代码生成下图:

Contour intersection

我本以为只有一行,但有两行。。。我做错什么了?你知道吗


Tags: offromimportplotmatplotlibbecslength
1条回答
网友
1楼 · 发布于 2024-05-08 19:37:21

因为我不能执行您的示例(为了将来,您可以通过构造一些伪数据集使其可运行,它只需给出相同的两行行为),所以我将其修改为自包含的。我在matplotlib1.5.1中没有看到这个bug:

import numpy

import matplotlib
from matplotlib import pyplot as plot
from mpl_toolkits.mplot3d import Axes3D

fig = plot.figure()
s = fig.add_subplot(1, 1, 1)
s.set_title('Shielding protection')
s.set_xlabel('Velocities (km/s)')
s.set_ylabel('Mass (grams), 10^X')
levels = numpy.linspace(0, 1, 25)

N = 100
m = numpy.linspace(-6.65, -5, N)
v = numpy.linspace(0, 40, N)
mass, velocities = numpy.meshgrid(m, v)
distribution = numpy.exp(-(mass + 6)**2  - (velocities - 20)**2 / 10)

cs_dist = s.contourf(
    velocities, mass, distribution, alpha=0.95, levels=levels,
)
fig.colorbar(cs_dist, format="%.5f")

contour = (mass - 6) + (velocities - 20)

cs_shield = s.contour(
    velocities, mass, contour, 1,
    levels=[0], colors='w', linestyles='solid'
)
s.clabel(cs_shield, inline=True)

fig.savefig('t.png')

enter image description here

相关问题 更多 >