【问题标题】:plotting contours from a three column array in matplotlib从 matplotlib 中的三列数组绘制轮廓
【发布时间】:2018-09-12 15:46:00
【问题描述】:

我有一个三列数组,包含两个参数,即 x 和 y 轴,以及这两个参数的卡方。考虑到卡方值,我应该制作这两个参数的网格,然后绘制 1-sigma、2-sigma 和 3-sigma 等高线。我怎样才能在 matplotlib 中做到这一点? 这是我的代码: x(这是“1.txt”文件中的第二列)和y(这是第三列)应该从min到max排列,为了制作x和y轴,我认为可以使用meshgrid完成.而 z(“1.txt”文件中的第一列)是卡方。

import numpy as np 
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
x = np.genfromtxt('1.txt', usecols=(1))
y = np.genfromtxt('1.txt', usecols=(2))
z = np.genfromtxt('1.txt', usecols=(0))
plt.figure()
X, Y = np.meshgrid(x,y) 
Z= griddata(x,y,z,X,Y)
contour=plt.contour(X,Y,Z)
plt.show()

此代码遇到错误: “RuntimeError:要在 griddata 中使用 interp='nn'(自然邻域插值),必须安装 natgrid。从 http://github.com/matplotlib/natgrid 安装它或改用 interp='linear'。” 当我使用 interp='linear' 时,运行代码会持续很长时间而没有任何结果。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 如果没有任何示例数据、尝试的代码以及可能的所需示例输出,将很难在这里获得具体的解决方案。你应该看看如何创建一个Minimal, Complete, and Verifiable example

标签: python matplotlib plot


【解决方案1】:

您似乎正在为列中的所有值创建一个“网格”。相反,您可能希望以递增的顺序创建一个规则的数字网格。例如。在数据的最小值和最大值之间使用 100 个值

X = np.linspace(x.min(), x.max(), 100)
Y = np.linspace(y.min(), y.max(), 100)
Z = griddata(x, y, z, xi, yi, interp='linear')
contour=plt.contour(X, Y, Z)

另见example

但请注意,matplotlib.mlab.griddata 已在较新版本的 matplotlib 中被删除。 new example 告诉你一些替代方案。

特别考虑使用原始值x,y,z 直接绘制三角轮廓,

plt.tricontour(x,y,z)

【讨论】:

  • 根据您的建议,我可以获得等高线图。但是,有一些额外的轮廓线。而且我也无法正确获得 2-sigma 轮廓线。有没有什么方法可以只得到 1-sigma、2-sigma 和 3-sigma 等高线而不需要任何额外的线?
  • 抱歉,我不知道 2D 数据集的 2-sigma 等高线是什么。如果您可以在问题中解释这一点,我可能会提供进一步的帮助。
  • 其实是一个3D数据集:参数x,参数y,卡方。
  • 好的,但是卡方的哪些值对应于 1-sigma、2-sigma 和 3-sigma?
  • 所以,您的意思是我应该添加一行,例如“levels = [0., 2.6, 5.2, 9.5]”,根据 1-sigma、2-sigma 和 3-sigma 进行调整.然后用 "plt.contourf(X, Y, Z, levels=levels, colors = ['g','r','b'])" 绘制它,以获得正确的结果。我说的对吗?
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多