numpy 如何像等高线图那样在椭圆中绘制标签?

6ljaweal  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(120)

问题

我试图绘制一个类似于下图的图形:

我使用以下代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

contours = [30, 40, 50]

v = np.array([15, 18])
colours = [
    (0.0, 0.26666666666666666, 0.10588235294117647, 1.0),
    (0.2917647058823529, 0.6886582083813917, 0.3827758554402153, 1.0),
    (0.8274509803921569, 0.9325490196078431, 0.8031372549019608, 1.0)
]

def ellipseFunction(x, v):
        return np.sqrt((x[0]/v[0])**2 + (x[1]/v[1])**2)

ellipses = [Ellipse((0, 0), width= 2*v[0]*contours[l], height=2*v[1]*contours[l], ec = colours[l], fc= "none") for l in range(len(contours))]

x = np.linspace(-2500, 2500, 100)
y = np.linspace(-2500, 2500, 100)
plt.figure()
plt.pcolormesh(x, y, ellipseFunction(np.meshgrid(x, y), v).T, cmap = 'plasma', zorder = -1, vmax = 150)
plt.gca().set_aspect(1./plt.gca().get_data_ratio())
for l in range(len(contours)):
    plt.gca().add_patch(ellipses[l])

输出:

问题

如何在椭圆的边缘添加椭圆标签(30、40和50),就像原始图像中的等高线图一样?

ecfdbz9o

ecfdbz9o1#

您可以使用带有参数levelsplt.contour来绘制等高线,然后添加带有clabel的标签。
完整代码:

import numpy as np
import matplotlib.pyplot as plt

contours = [30, 40, 50]

v = np.array([15, 18])
colours = [
    (0.0, 0.26666666666666666, 0.10588235294117647, 1.0),
    (0.2917647058823529, 0.6886582083813917, 0.3827758554402153, 1.0),
    (0.8274509803921569, 0.9325490196078431, 0.8031372549019608, 1.0)
]

def ellipseFunction(x, v):
        return np.sqrt((x[0]/v[0])**2 + (x[1]/v[1])**2)

x = np.linspace(-2500, 2500, 100)
y = np.linspace(-2500, 2500, 100)
z = ellipseFunction(np.meshgrid(x, y), v).T
fig, ax = plt.subplots()
im = plt.pcolormesh(x, y, z, cmap = 'plasma', zorder = -1, vmax = 150)
plt.gca().set_aspect(1./plt.gca().get_data_ratio())
CS = plt.contour(x, y, z, levels=contours)
ax.clabel(CS)
plt.colorbar(im)

输出:

相关问题