【问题标题】:How to create contours correctly with matplotlib?如何使用 matplotlib 正确创建轮廓?
【发布时间】:2015-12-11 13:42:55
【问题描述】:

我有以下形式的数据 (link):

Y   X 0 X 10    X 20
15  4.83    4.91    4.99
20  4.58    4.65    4.73
25  4.43    4.49    4.56

我正在尝试绘制 X 标签值的轮廓,在这些情况下为 0、10、20(代码中的 z),x 轴为 X 值,y 轴为 Y 值.使用代码创建绘图:

import numpy as np
import re
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import matplotlib.cm as cm

with open('contour.dat', "r") as data:
    while True:
        line = data.readline()
        if not line.startswith('#'):
            break
    data_header = [i for i in line.strip().split('\t') if i]
_data_ = np.genfromtxt('contour.dat', skiprows = 2, delimiter = '\t')
x = _data_[:, 0]
y = _data_[:, 1:]


y_n = []
for i in range(len(data_header)):
    if data_header[i][0] == 'X':
        y_n = np.int_(np.append(y_n, i))
y_index = [data_header[i] for i in y_n]
z = []
for i in range(0, len(data_header)):
    z = np.append(z, re.findall(r"[-+]?\d*\.\d+|\d+", data_header[i]))
z = z.reshape(len(z), 1)
z = np.tile(z, (len(x), len(x)))


with PdfPages('./on_tau.pdf') as p_tau:
    _p_vs_tau_ = plt.figure(figsize=(5, 5))
    _p_vs_tau_.clf()
    p_vs_tau = plt.subplot(111)
    x, y = np.meshgrid(x, y)
    surf = plt.contourf(y, x, z, 30, rstride=1, cstride=1, cmap=cm.gist_heat,
                           linewidth=0, antialiased=False, alpha = 1.0)
    surf1 = plt.contour(y, x, z, 30, colors = '#000000',
                           linewidths=0.5, antialiased=False, alpha = 1.0)
    plt.clabel(surf1, inline=1, fontsize=6)
    p_tau.savefig(bbox_inches='tight')
    plt.close()

但我没有得到正确的轮廓。我相信我在某处做错了什么,可能是在重复 z 值时。如何正确获取轮廓?

【问题讨论】:

    标签: python matplotlib contour contourf


    【解决方案1】:

    这会生成您正在寻找的轮廓吗?您的 z=np.tile 语句中的修改代码(现已注释掉):

    #z = np.tile(z, (len(x), len(x)))
    xm = np.tile(x,11)
    xm = np.reshape(xm,(11,10)).T
    zm = np.tile(z,10).T
    
    with PdfPages('./on_tau.pdf') as p_tau:
        _p_vs_tau_ = plt.figure(figsize=(5, 5))
        _p_vs_tau_.clf()
        p_vs_tau = plt.subplot(111)
        #x, y = np.meshgrid(x, y)
        surf = plt.contourf(y, xm, zm, 30, rstride=1, cstride=1, cmap=cm.gist_heat,
                           linewidth=0, antialiased=False, alpha = 1.0)
        surf1 = plt.contour(y, xm, zm, 30, colors = '#000000',
                           linewidths=0.5, antialiased=False, alpha = 1.0)
        plt.clabel(surf1, inline=1, fontsize=6)
        p_tau.savefig(bbox_inches='tight')
        plt.close()
    

    【讨论】:

    • 你知道如何得到最后一个值的轮廓吗?
    • 我认为这与您的数据正好在边界上有关。在 zm 赋值语句后添加: zm = zm.astype(float); zm[zm==100.] += 0.001。然后它应该显示最后一条等高线。
    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2021-09-08
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多