污染玫瑰小区网格化

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

我正试图按照链接中的描述创建一个污染玫瑰图。绘制风蔷薇:使污染玫瑰的浓度设置为颜色

回复中的例子是工作,但当我使用我的数据,然后它给出了一个奇怪的情节。有什么建议,我哪里出错了?谢谢你的建议。

import matplotlib.pyplot as plt
import numpy as np

wd = [90.,297.,309.,336.,20.,2.,334.,327.,117.,125.,122.,97.,95.,97.,103.,106.,125.,148.,147.,140.,141.,145.,144.,151.,161.]
ws = [15,1.6,1.8,1.7,2.1,1.6,2.1,1.4,3,6.5,7.1,8.2,10.2,10.2,10.8,10.2,11.4,9.7,8.6,7.1,6.4,5.5,5,5,6]
oz = [10.,20.,30.,40.,50.,60.,70.,80.,90.,100.,110.,120.,90.,140.,100.,106.,125.,148.,147.,140.,141.,145.,144.,151.,161.]

pi_fac = 22/(7*180.)
wd_rad = [w * pi_fac for w in wd]
ws_r = np.linspace(min(ws),max(ws),16)

WD,WS = np.meshgrid(wd_rad,ws_r) 
C = oz + np.zeros((len(ws_r),len(wd)),dtype=float)
C = np.ma.masked_less_equal(C,10)

fig, ax = plt.subplots(subplot_kw={"projection":"polar"})
ax.pcolormesh(WD,WS,C,vmin=10, vmax=170) # I tried different vmin and vmax too

plt.show()

Pic with error

matplotlib mesh
1个回答
1
投票

链接的帖子假设你有一个常规的方向和速度的网格,但你的输入似乎是相当无序的组合。

要创建一个情节与彩色区域取决于 oz 值,您可以尝试 tricontourf. tricontourf 读取不需要位于网格上的 X、Y 和 Z 值,并创建一个等高线图。虽然它适用于矩形布局,但也可能适用于您的情况。不过当从360º穿越到0º时,会有一个不连续的地方。

这个例子的图还画了一个颜色条,以显示在哪个范围内的位置。oz 值对应于哪种颜色。vminvmax 可以改变这种颜色的映射。

import matplotlib.pyplot as plt
import numpy as np

wd = [90, 297, 309, 336, 20, 2, 334, 327, 117, 125, 122, 97, 95, 97, 103, 106, 125, 148, 147, 140, 141, 145, 144, 151, 161]
ws = [15, 1.6, 1.8, 1.7, 2.1, 1.6, 2.1, 1.4, 3, 6.5, 7.1, 8.2, 10.2, 10.2, 10.8, 10.2, 11.4, 9.7, 8.6, 7.1, 6.4, 5.5, 5, 5, 6]
oz = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 90, 140, 100, 106, 125, 148, 147, 140, 141, 145, 144, 151, 161]

fig, ax = plt.subplots(subplot_kw={"projection": "polar"})

cont = ax.tricontourf(np.radians(np.array(wd)), ws, oz, cmap='hot')
plt.colorbar(cont)
plt.show()

demo plot

有了 ax.scatter(np.radians(np.array(wd)), ws, c=oz, cmap='hot', vmax=250) 你可以创建一个散点图来了解输入的颜色是怎样的。

您可能会想把 Python 的 风光图书馆 来使极地图与风蔷薇相似。

另一种方法可能更接近相关问题的目的,就是使用 scipy 的 interpolate.griddata 来将数据映射到网格上。为了消除没有数据的区域,可以使用 "under "颜色为 "none",条件是 vmin 是高于零的。

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

wd = [90, 297, 309, 336, 20, 2, 334, 327, 117, 125, 122, 97, 95, 97, 103, 106, 125, 148, 147, 140, 141, 145, 144, 151, 161]
ws = [15, 1.6, 1.8, 1.7, 2.1, 1.6, 2.1, 1.4, 3, 6.5, 7.1, 8.2, 10.2, 10.2, 10.8, 10.2, 11.4, 9.7, 8.6, 7.1, 6.4, 5.5, 5, 5, 6]
oz = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 90, 140, 100, 106, 125, 148, 147, 140, 141, 145, 144, 151, 161]
wd_rad = np.radians(np.array(wd))
oz = np.array(oz, dtype=np.float)


WD, WS = np.meshgrid(np.linspace(0, 2*np.pi, 36), np.linspace(min(ws), max(ws), 16 ))
Z = interpolate.griddata((wd_rad, ws), oz, (WD, WS), method='linear')

fig, ax = plt.subplots(subplot_kw={"projection": "polar"})
cmap = plt.get_cmap('hot')
cmap.set_under('none')
img = ax.pcolormesh(WD, WS, Z, cmap=cmap, vmin=20)
plt.colorbar(img)
plt.show()

gridded plot

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