Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用三个1D数组绘制等高线图_Python_Contour - Fatal编程技术网

在python中使用三个1D数组绘制等高线图

在python中使用三个1D数组绘制等高线图,python,contour,Python,Contour,正如标题所示,我想使用三个一维阵列绘制等高线图。这么说吧 x = np.array([1,2,3]) 及 及 要在matplotlib中进行轮廓图绘制,我将x和y坐标网格化为x,y=meshgrid(x,y),但z阵列也必须是二维阵列。然后如何将z转换为二维数组以便使用?您的z是错误的。它需要给出网格每个点的值。如果z是x和y的函数,则在下面我所指的x_网格处计算z: import numpy as np import matplotlib.pyplot as plt def f(x):

正如标题所示,我想使用三个一维阵列绘制等高线图。这么说吧

x = np.array([1,2,3])


要在matplotlib中进行轮廓图绘制,我将
x
y
坐标网格化为
x,y=meshgrid(x,y)
,但
z
阵列也必须是二维阵列。然后如何将
z
转换为二维数组以便使用?

您的
z
是错误的。它需要给出网格每个点的值。如果
z
x
y
的函数,则在下面我所指的
x_网格处计算
z

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return (x[:,0]**2 + x[:,1]**2)

x = np.array([1,2,3])
y = np.array([1,2,3])
xx, yy = np.meshgrid(x, y)
X_grid = np.c_[ np.ravel(xx), np.ravel(yy) ]
z = f(X_grid)

z = z.reshape(xx.shape)

plt.contour(xx, yy, z)

在我看来,你描述的是一条穿过空间的一维曲线,而不是曲面。我说,因为我假设,
x[I]
y[I]
z[I]
是一个点的坐标。您无法使用这些点轻松定义曲面,因为您的点仅依赖于一个变量
i
,因此仅描述具有一个自由度的形状。考虑你可以把列表中的每个点连接到下一个点,这只会给你一个一维的点链。为了使曲面由三个阵列组成,必须定义9个z值,而不是3个


很抱歉,这不是一个有用的答案,但我没有发表评论的声誉。

如果我使用的是我为便于操作而收集的数据,我会经常遇到这个问题。在展开的数据中,二维阵列被展平

原始数据具有每个坐标的x、y和z值:

x = [0, 1, 2; 0, 1, 2]

y = [0, 0, 0; 1, 1, 1]

z = [0.1 , 0.2, 0.3 ; 0.2, 0.3, 0.4]
对所有三个数组使用np.ravel()可以使它们成为一维6元素长数组

xx = np.ravel(x); yy = np.ravel(y) ; zz = np.ravel(z)
现在xx=([0,1,2,0,1,2]),对于yy和zz也是如此

如果这是您正在处理的数据类型,并且数据已完全采样,则可以使用散点图模拟轮廓图。只有当您的数据集采样足够好,足以填满所有空间时,这才有效

plt.scatter(xx,yy,c=zz,cmap=cm.Reds)

尽管OP意识到不可能用问题中的数据绘制等高线图,但在数据可以被认为是3d曲面的情况下,这仍然是一个相关问题

三个1D阵列的等高线打印选项 基本上有三种选择

  • 如果不一定要使用正则函数,则使用来绘制它。使用网格化和非网格化数据
  • 如果数据是网格化的,但在三个单独的1d数组中,则可以将其拆分为两个1d数组和一个2d数组,并使用
  • 如果您的数据没有网格化,并且您不想使用,则可以将数据插值到网格中,并使用网格进行打印。有很多方法可以帮助你做到这一点。插值数据后,可以使用选项2中所示的技术
  • 选项1:tricontourf 这个非常简单。只需像这样使用函数(参见附录中创建示例数据)

    从matplotlib导入pyplot作为plt
    plt.tricontourf(扩展数据、ydata、zdata)
    plt.show()
    
    输出

    选项2:栅格1D阵列和轮廓线 如果一个人将网格化数据存储在三个1D数组中,并且出于某种原因不想使用tricontourf,那么您可以用它绘制一个图。(附录中给出了示例数据)

    将熊猫作为pd导入
    从matplotlib导入pyplot作为plt
    df=pd.DataFrame(dict(x=xdata,y=ydata,z=zdata))
    xcol,ycol,zcol=“x”,“y”,“z”
    df=df.sort_值(by=[xcol,ycol])
    xvals=df[xcol].unique()
    yvals=df[ycol].unique()
    zvals=df[zcol]。值。重塑(len(xvals),len(yvals)).T
    轮廓曲线图(xVAL、yVAL、zVAL)
    plt.show()
    
    输出

    想法解释
    • 首先,必须对数据进行网格化,因为这是绘图的工作方式。如果不是,则可以将其插值到新栅格
    • 然后,创建
      df
      作为中间介质
    • 然后,使用该方法对x和y数据进行排序。这将使下一步中由
      unique()
      给出的值排序
    • 使用获取x和y数据的所有唯一值。这是“网格网格”运算的一种逆运算
    • 由于dataframe列的值只是numpy数组,因此可以调用该方法来创建所需的二维数组
    • 现在,如果x有N个唯一值,y有M个唯一值,那么
      zvals
      将是一个(N,M)2d阵列,可以馈送到plt.contour
    附录:示例数据
    z
    到底包含什么?首先,它不应该是2D吗?目的是,对于每个x和y值,都存在一个对应的z值。所以你在3个点((1,1),(2,2),(3,3))有函数的值,想做一个等高线图吗?我没有函数。我只有三个1d阵列,但您希望等高线图显示什么。通常,等高线图是一种曲线图,它是一个函数的等值线。一行上只有三个点,有三个值与之关联。什么是xx1和xx2?注意z=“values at…”,因为这里是给z赋值的字符串。除此之外,我还得到以下错误:ValueError:新数组的总大小必须为unchanged@SmailKozarcanin您需要每个网格点的
    z
    值,但您没有提供该值,因此您的问题实际上无法回答,除非您告诉我们如何查找缺少的
    z
    值。。。请看西奥的答案,这更像是一个评论。问题是如何从z值列表生成一个图。它没有询问如何从函数生成图形。作为用例,它们是完全不同的,并且答案对于所问的问题没有用处。也就是说,你没有回答这个问题。也许@NP8的正确答案是在他错误地将你标记为正确后发布的。因为OP选择了它,所以它是正确的,这种说法没有根据。如果OP是这样的专家,他就不用问了。我明白你的意思。谢谢,这是我的
    xx = np.ravel(x); yy = np.ravel(y) ; zz = np.ravel(z)
    
    plt.scatter(xx,yy,c=zz,cmap=cm.Reds)
    
    import numpy as np
    import pandas as pd
    
    xs, ys = np.linspace(-4, 4), np.linspace(-4, 4)
    xgrid, ygrid = np.meshgrid(xs, ys)
    xdata, ydata = np.ravel(xgrid), np.ravel(ygrid)
    zdata = (
        2.3 * (1 - xdata) ** 2 * np.exp(-(ydata ** 2) - (xdata + 0.9) ** 2)
        - 13.3
        * (ydata / 2.2 - ydata ** 3 - xdata ** 4)
        * np.exp(-(ydata ** 2) - xdata ** 2)
        - 0.8 * np.exp(-((ydata + 1) ** 2) - xdata ** 2)
    )