关于python中matplotlib绘制等高图的问题

用matplotlib的plt.contour(x,y,z,8,colors='black')绘制等高图,其高度值z得是二维数组,但我手里高度值只是一组列表,要怎样才能绘制出等高图呢?

代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#数据准备
x=[100,200,300,400,500]  #横坐标
y=[300,500,100,200,500]  #纵坐标
z=[100,120,110,150,180]  #高度值,运行时这里出错,提示“Input z must be 2D, not 1D”,
                         #问题是如何转换成二维数组?????

'''添加标题'''
plt.title(f"测试", fontsize=20, fontname="SimHei")   #"SimHei"黑体字体可确保中文正常显示

'''contour()函数可生成三维结构表面的等值线图'''
C = plt.contour(x,y,z,8,colors='black')

'''cmap=plt.cm.hot为等值线添加过渡色'''
plt.contour(x,y,z,8,cmap=plt.cm.hot)

'''等值线间添加过渡色'''
plt.contourf(x,y,z, 8)

'''colorbar()可在右侧显示颜色值'''
plt.colorbar()

'''clabel用于标记等高线'''
plt.clabel(C,inline=1,fontsize=10)

plt.show()

可以将高度值 z 转换成二维数组的形式,然后再使用 plt.contour 函数绘制等高图。

比如,可以使用 numpy.meshgrid 函数将横坐标和纵坐标列表转换成网格坐标矩阵,然后将这两个网格坐标矩阵广播相乘得到一个矩形网格坐标矩阵,再将高度值列表转换成与网格坐标矩阵大小相同的矩阵,最后将矩阵传入 plt.contour 函数即可。

import numpy as np
import matplotlib.pyplot as plt

# 数据准备
x = [100, 200, 300, 400, 500]  # 横坐标
y = [300, 500, 100, 200, 500]  # 纵坐标
z = [100, 120, 110, 150, 180]  # 高度值

# 将横坐标和纵坐标列表转换成网格坐标矩阵
xx, yy = np.meshgrid(x, y)

# 将高度值列表转换成与网格坐标矩阵大小相同的矩阵
zz = np.array(z).reshape(xx.shape)

# 绘制等高图
C = plt.contour(xx, yy, zz, 8, colors='black')

# 添加标题
plt.title(f"测试", fontsize=20, fontname="SimHei")   # "SimHei"黑体字体可确保中文正常显示

# 等值线间添加过渡色
plt.contourf(xx, yy, zz, 8)

# colorbar()可在右侧显示颜色值
plt.colorbar()

# clabel用于标记等高线
plt.clabel(C,inline=1,fontsize=10)

plt.show()

仅供参考,望采纳,谢谢。

你可以将你的横坐标 x、纵坐标 y 和高度值 z 传入 NumPy 的 meshgrid 函数,然后使用 array 函数将坐标网格和高度值结合为二维数组。就可以使用 plt.contour 函数绘制等高图了。

  • 修改后的代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#数据准备
x=[100,200,300,400,500] #横坐标
y=[300,500,100,200,500] #纵坐标
z=[100,120,110,150,180] #高度值

# 将横纵坐标转化为坐标网格
X, Y = np.meshgrid(x, y)

# 将坐标网格与高度值结合为二维数组
Z = np.array([z])

'''添加标题'''
plt.title(f"测试", fontsize=20, fontname="SimHei") #"SimHei"黑体字体可确保中文正常显示

'''contour()函数可生成三维结构表面的等值线图'''
C = plt.contour(X,Y,Z,8,colors='black')

'''cmap=plt.cm.hot为等值线添加过渡色'''
plt.contour(X,Y,Z,8,cmap=plt.cm.hot)

'''等值线间添加过渡色'''
plt.contourf(X,Y,Z, 8)

'''colorbar()可在右侧显示颜色值'''
plt.colorbar()

'''clabel用于标记等高线'''
plt.clabel(C,inline=1,fontsize=10)

plt.show()

你可以使用 NumPy 库的 reshape 函数将 z 转换为二维数组。例如:

z = np.array(z).reshape(5, 1)
或者:
z = np.array(z).reshape(1, 5)
然后你就可以使用 z 作为 plt.contour 的参数了。
如果你希望自定义等高线的数量,你可以在第三个参数中指定等高线的数量,例如:

C = plt.contour(x,y,z,5,colors='black')
这样就会绘制出 5 条等高线。
另外,你也可以使用 NumPy 库的 linspace 函数指定等高线的高度值范围,然后通过 plt.contour 函数绘制等高线。例如:

生成 5 个等高线的高度值范围

levels = np.linspace(100, 180, 5)

C = plt.contour(x, y, z, levels, colors='black')
plt.contourf(x, y, z, levels)
plt.colorbar()
plt.clabel(C, inline=1, fontsize=10)
这样就会绘制 5 条等高线,高度值范围分别为 100, 120, 140, 160, 180。

简单啊 既然是一维的,那就要想办法转为二维的啊,可以使用Numpy库中的reshape方法转,剩下的就简单了

实现 等高线图 - 基于python-matplotlib
借鉴下

import numpy as np
import matplotlib.pyplot as plt


# 计算x,y坐标对应的高度值
def fun(x, y):
    return (1-x/2+x**2+y**3) * np.exp(-x**2-y**2)


# 设置个背景色
plt.figure(facecolor='#66ff33')
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 把x,y数据转换为二维数据(网格化)
X, Y = np.meshgrid(x, y)
# 填充等高线
plt.contourf(X, Y, fun(X, Y))

# 显示图表
plt.show()


可以使用 numpy 中的 meshgrid 函数将其转换为二维数组。

假设高度值是一个一维列表 z,那么可以使用如下代码将其转换为二维数组:

import numpy as np

# 假设 x 和 y 是网格的横纵坐标
X, Y = np.meshgrid(x, y)
Z = np.array(z)


使用 plt.contour 函数绘制等高图了。

import matplotlib.pyplot as plt

plt.contour(X, Y, Z, 8, colors='black')