我有一个包含三列的 pandas 数据框。第一列是值 z,另外两列是极坐标(分别为 r 和 phi,其中 phi 假定为度数)。 r 和 phi 是整数,其范围为 r=[0,1,2...N] 且 phi=[0,1,2...360]。
我想根据提供的坐标为值 z 创建极坐标图。为此,我认为等高线图将是解决方案。我首先意识到轮廓函数需要一个网格,所以我使用它而不是从我的 df 中获取列。不过,当我尝试使用此代码时:
phi_range = np.radians(np.linspace(0, 360, 1))
r_range = np.arange(0, 10, 1)
r, theta = np.meshgrid(phi_range, r_range)
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.contourf(theta, r, z)
我收到错误
Input z must be 2D, not 1D
。这对我来说很有意义。在我过去做过的极坐标图中,我通常能够通过函数传递网格来生成 z 值。然而,在这种情况下,我必须使用给我的数据集。
还有办法继续制作这种类型的情节吗?
尽管效率不是很高,但您可以创建一个
len(phi_range) × len(r_range)
空数组并使用数据框中的值来填充它。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Set random seed for reproducibility
SEED = 123
np.random.seed(123)
# Create sample df
ROWS, COLS = (500, 3)
R_MAX = 10
z = np.random.rand(ROWS)
r = np.random.randint(low = 0, high = R_MAX+1, size = ROWS)
phi = np.random.randint(low = 0, high = 360+1, size = ROWS)
df = pd.DataFrame(np.vstack((z, r, phi)).T, columns = ['z', 'r', 'phi'])
phi_range = np.radians(np.linspace(0, 360, 360 + 1))
r_range = np.arange(0, R_MAX+1, 1)
z = np.zeros((len(phi_range), len(r_range)))
z[df.loc[:,'phi'].values.astype(np.int64),df.loc[:,'r'].values.astype(np.int64)] = df.loc[:,'z']
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.contourf(phi_range, r_range, z.T)
plt.show()
下面你可以看到我得到了什么。它根本没有任何意义,因为数据是随机生成的,但它向您展示了一种从您描述的 df 获取等值线图的方法。
如果这不是您想要的,您应该编辑您的帖子以使代码成为 MWE,可能包括您的(部分)数据。