首页 > 解决方案 > Matplotlib:在极坐标图上使用非线性比例

问题描述

我想绘制一个测量的天线辐射图。目前我正在使用以下脚本:

#!/usr/bin/env python3 -u
# vim: set ai et ts=4 sw=4:

from math import pi
import matplotlib.pyplot as plt
import csv

xs = []
ys = []
with open('raw-data.csv', newline = '') as f:
    for row in csv.reader(f, delimiter = ',', quotechar = '"'):
        xs += [ 2*pi*float(row[0])/360 ]
        ys += [ float(row[1]) ]

max_y = max(ys)
ys = [ y - max_y for y in ys ]

dpi = 80
fig = plt.figure(dpi = dpi, figsize = (512 / dpi, 384 / dpi) )

ax = plt.subplot(111, projection='polar')
ax.set_theta_offset(2*pi*90/360)
ax.plot(xs, ys, linestyle = 'solid', linewidth=3)
ax.set_rmax(0)
ax.set_rticks([-6*i for i in range(0,7)])
ax.set_yticklabels([''] + [str(-6*i) for i in range(1,7)])
ax.set_rlabel_position(0)
ax.set_thetagrids(range(0, 360, 15))
ax.set_theta_direction(-1)
ax.grid(True)

fig.savefig('linear.png')

这是原始数据.csv:

0,-31.4
10,-31.9
20,-32
30,-32.4
40,-38.1
50,-41.1
60,-44.5
70,-59
80,-73
90,-67.3
100,-70.5
110,-62.1
120,-58.2
130,-55.7
140,-55.6
150,-54.7
160,-50.3
170,-43.7
180,-40.8
190,-41.2
200,-43.2
210,-45.9
220,-49.7
230,-53.8
240,-57.3
250,-60.6
260,-65.2
270,-61.6
280,-61.1
290,-60.8
300,-52.9
310,-46.2
320,-39.7
330,-35.1
340,-33.3
350,-31.9
360,-31.4

我对结果几乎很满意:

在此处输入图像描述

但我希望比例有点不同,就像ARRL常用的比例。这是一个例子:

在此处输入图像描述

请注意,比例是非线性的。以下是 ARRL 天线手册对它的描述:

ARRL 使用的修改后的对数网格有一个同心网格线系统,其间距为信号电压值的 0.89 倍的对数。在这个网格中,从主瓣下降 30 和 40 dB 的小瓣是可区分的。这种波瓣在 VHF 和 UHF 工作中受到关注。在 0 dB 和 –3 dB 处绘制点之间的间距明显大于 –20 和 –23 dB 之间的间距,而后者又明显大于 –50 和 –53 dB 之间的间距。例如,0 到 –3 dB 所覆盖的刻度距离约为图表半径的 1/10。下一个 3 dB 增量(至 –6 dB)的比例距离略小,准确地说是第一个增量的 89%。下一个 3-dB 增量(至 –9 dB)的标度距离再次为 89% 秒。刻度的构建使得进程在图表中心以 –100 dB 结束。因此,间隔的周期性通常对应于天线性能的这种变化的相对重要性。本出版物中的天线模式图是在修改后的对数网格上绘制的,类似于图 A-(C) 所示。

我不需要 ARRL 使用的确切方法,但看起来相似的东西会很好。我尝试了不同的方法,但没有成功。例如,当我尝试使用时,ax.set_rscale('function',...我会得到这样的图像:

在此处输入图像描述

一点建议将不胜感激。

标签: pythonmatplotlib

解决方案


推荐阅读