在 Python 中绘制围绕原点径向对称的一维数据集
Plotting 1-D dataset with radial symmetry around the origin in Python
这可能是一个非常基本的问题,但我的 python 知识有限,我在解读其他问题和答案时遇到了一些困难,所以我希望这里有人可以提供帮助...
我有一组一维数据点(本质上是沿半径的每个点的分子数),我想将其绘制为二维径向对称图像。我想围绕原点 (0,0) 旋转它。
基本上,我有类似
但我想要像
这样的东西
我已经看到使用函数或定义的向量(即使用 scipy 的插值模块)相对容易地完成此操作,但我没有函数或随机生成的数据 - 我有列表。我知道一定有一种简单的方法可以做到这一点,但如果有人能指出正确的方向,我将不胜感激!
我提供了一个非常非常小的示例数据集(以对数比例绘制成一条线)供人们玩,如果他们愿意的话:
import numpy as np
import matplotlib.pyplot as plt
rad25 = np.array([25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1])
O_rad25 = np.array([1.01E+15,3.00E+14,1.20E+14,5.63E+13,2.90E+13,1.59E+13,9.21E+12,5.53E+12,3.43E+12,2.18E+12,1.42E+12,9.44E+11,6.38E+11,4.37E+11,3.03E+11,2.13E+11,1.51E+11,1.08E+11,7.77E+10,5.60E+10,4.02E+10,2.84E+10,1.94E+10,1.20E+10,5.78E+09])
plt.plot(rad25,O_rad25)
plt.yscale('log')
plt.xlabel('Radius (distance from center in um)')
plt.ylabel('Number of molecules')
plt.show()
您需要创建一个 0 - 360 度的值数组,然后从这个数组和您的值数组创建一个网格。然后可以将其绘制在径向投影的子图上。
类似这样,但包含您的原因数据:
import numpy as np
import matplotlib.pyplot as plt
# Swap out with your data
radialVals = np.linspace(0,1)
azm = np.linspace(0, 2 * np.pi)
r, th = np.meshgrid(radialVals, azm)
z = (r ** 2.0) / 4.0
plt.subplot(projection="polar")
plt.pcolormesh(th, r, z)
plt.plot(azm, r, ls='none')
plt.grid()
plt.show()
我从 Jon 的回答中借用了一些内容(他的答案几乎是正确的),并添加了一个颜色条来说明,但这应该可以满足您的需求。由于您知道半径并且数据具有径向对称性,因此极坐标图是自然的选择。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
azm = np.linspace(0, 2 * np.pi)
r, th = np.meshgrid(rad25, azm)
z = np.tile(O_rad25, (r.shape[0], 1))
plt.pcolormesh(th, r, z, norm=colors.LogNorm(O_rad25.min(), O_rad25.max()))
plt.colorbar(label='Number of Molecules')
这可能是一个非常基本的问题,但我的 python 知识有限,我在解读其他问题和答案时遇到了一些困难,所以我希望这里有人可以提供帮助...
我有一组一维数据点(本质上是沿半径的每个点的分子数),我想将其绘制为二维径向对称图像。我想围绕原点 (0,0) 旋转它。
基本上,我有类似
我已经看到使用函数或定义的向量(即使用 scipy 的插值模块)相对容易地完成此操作,但我没有函数或随机生成的数据 - 我有列表。我知道一定有一种简单的方法可以做到这一点,但如果有人能指出正确的方向,我将不胜感激!
我提供了一个非常非常小的示例数据集(以对数比例绘制成一条线)供人们玩,如果他们愿意的话:
import numpy as np
import matplotlib.pyplot as plt
rad25 = np.array([25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1])
O_rad25 = np.array([1.01E+15,3.00E+14,1.20E+14,5.63E+13,2.90E+13,1.59E+13,9.21E+12,5.53E+12,3.43E+12,2.18E+12,1.42E+12,9.44E+11,6.38E+11,4.37E+11,3.03E+11,2.13E+11,1.51E+11,1.08E+11,7.77E+10,5.60E+10,4.02E+10,2.84E+10,1.94E+10,1.20E+10,5.78E+09])
plt.plot(rad25,O_rad25)
plt.yscale('log')
plt.xlabel('Radius (distance from center in um)')
plt.ylabel('Number of molecules')
plt.show()
您需要创建一个 0 - 360 度的值数组,然后从这个数组和您的值数组创建一个网格。然后可以将其绘制在径向投影的子图上。
类似这样,但包含您的原因数据:
import numpy as np
import matplotlib.pyplot as plt
# Swap out with your data
radialVals = np.linspace(0,1)
azm = np.linspace(0, 2 * np.pi)
r, th = np.meshgrid(radialVals, azm)
z = (r ** 2.0) / 4.0
plt.subplot(projection="polar")
plt.pcolormesh(th, r, z)
plt.plot(azm, r, ls='none')
plt.grid()
plt.show()
我从 Jon 的回答中借用了一些内容(他的答案几乎是正确的),并添加了一个颜色条来说明,但这应该可以满足您的需求。由于您知道半径并且数据具有径向对称性,因此极坐标图是自然的选择。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
azm = np.linspace(0, 2 * np.pi)
r, th = np.meshgrid(rad25, azm)
z = np.tile(O_rad25, (r.shape[0], 1))
plt.pcolormesh(th, r, z, norm=colors.LogNorm(O_rad25.min(), O_rad25.max()))
plt.colorbar(label='Number of Molecules')