给定一个包含 z 值和极坐标 (r, phi) 的表格,如何使用 matplotlib 在极坐标网格上绘制这些值?

问题描述 投票:0回答:1

我有一个包含三列的 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 值。然而,在这种情况下,我必须使用给我的数据集。

还有办法继续制作这种类型的情节吗?

python pandas dataframe matplotlib plot
1个回答
0
投票

尽管效率不是很高,但您可以创建一个

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 获取等值线图的方法。

enter image description here

如果这不是您想要的,您应该编辑您的帖子以使代码成为 MWE,可能包括您的(部分)数据。

© www.soinside.com 2019 - 2024. All rights reserved.