147 lines
3.9 KiB
Python
Executable File
147 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# polar-plot
|
|
#
|
|
# Copyright (C) 2022, 2023, Jeff Moe
|
|
# Copyright (C) 2023, Cees Bassa
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# polar_plot
|
|
# Generate graphical plot of radio interference.
|
|
#
|
|
# Usage:
|
|
# polar_plot [filename]
|
|
#
|
|
# Example:
|
|
# ./polar-plot data/sample.csv
|
|
# ./polar-plot data/rtl_power-sample.csv
|
|
|
|
|
|
import argparse
|
|
import locale
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
import pandas as pd
|
|
import re
|
|
import scipy
|
|
import seaborn as sns
|
|
import sys
|
|
|
|
from pandas.plotting import scatter_matrix
|
|
|
|
locale.setlocale(locale.LC_ALL, "en_US.utf8")
|
|
plt.rcParams["axes.formatter.use_locale"] = True
|
|
|
|
|
|
def load_samples():
|
|
parser = argparse.ArgumentParser(
|
|
description="Radio Interference Polar Plotter.",
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
)
|
|
parser.add_argument(
|
|
"infile",
|
|
nargs="?",
|
|
type=argparse.FileType("r"),
|
|
default=sys.stdin,
|
|
help="filename, default stdin",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
datafile = args.infile.name
|
|
|
|
with open(datafile) as f:
|
|
firstline = f.readline().rstrip()
|
|
|
|
if firstline == "1, 38.93":
|
|
print("Test data from sample.csv")
|
|
df = pd.read_csv(
|
|
datafile, skiprows=0, usecols=[0, 1], names=("Azimuth", "Energy")
|
|
)
|
|
|
|
elif re.match(re.compile("20*"), firstline):
|
|
print("rtl_power CSV file. Not yet supported.")
|
|
exit()
|
|
|
|
else:
|
|
print("Unknown file type.")
|
|
exit()
|
|
|
|
return df
|
|
|
|
|
|
def print_table(df):
|
|
# Print the Dataframe loaded from CSV
|
|
with pd.option_context("display.max_rows", None, "display.max_columns", None):
|
|
print(df)
|
|
|
|
|
|
def display_plot(df):
|
|
sns.set_theme()
|
|
fig = plt.figure(figsize=(8, 8), facecolor="xkcd:off white")
|
|
ax = fig.add_subplot(111, projection="polar")
|
|
ax.set_facecolor("xkcd:powder blue")
|
|
|
|
ax.set_title(
|
|
"Radio Interference Polar Plot".format("seaborn"),
|
|
color="xkcd:cornflower blue",
|
|
fontsize="large",
|
|
fontweight="bold",
|
|
)
|
|
|
|
ax.set_theta_offset(np.pi / 2.0)
|
|
ax.set_rticks([90, 60, 30, 0])
|
|
ax.set_rgrids([90, 60, 30, 0], ["", "30$^\circ$", "60$^\circ$", ""], angle=22.5)
|
|
ax.grid(True)
|
|
|
|
ax.bar(1 / 60, 38.93, width=0.25)
|
|
ax.bar(15 / 60, 38.31, width=0.25)
|
|
ax.bar(30 / 60, 37.77, width=0.25)
|
|
ax.bar(45 / 60, 37.33, width=0.25)
|
|
ax.bar(60 / 60, 38.54, width=0.25)
|
|
ax.bar(75 / 60, 38.81, width=0.25)
|
|
ax.bar(90 / 60, 37.55, width=0.25)
|
|
ax.bar(105 / 60, 29.18, width=0.25)
|
|
ax.bar(120 / 60, 29.32, width=0.25)
|
|
ax.bar(135 / 60, 37.00, width=0.25)
|
|
ax.bar(150 / 60, 36.48, width=0.25)
|
|
ax.bar(165 / 60, 32.46, width=0.25)
|
|
ax.bar(180 / 60, 34.92, width=0.25)
|
|
ax.bar(195 / 60, 38.65, width=0.25)
|
|
ax.bar(210 / 60, 39.07, width=0.25)
|
|
ax.bar(225 / 60, 39.50, width=0.25)
|
|
ax.bar(240 / 60, 39.42, width=0.25)
|
|
ax.bar(255 / 60, 37.33, width=0.25)
|
|
ax.bar(270 / 60, 38.96, width=0.25)
|
|
ax.bar(285 / 60, 38.14, width=0.25)
|
|
ax.bar(300 / 60, 36.32, width=0.25)
|
|
ax.bar(315 / 60, 35.26, width=0.25)
|
|
ax.bar(330 / 60, 39.14, width=0.25)
|
|
ax.bar(345 / 60, 39.60, width=0.25)
|
|
|
|
ax.set_ylim(0.0, 40.0)
|
|
plt.tight_layout()
|
|
plt.show()
|
|
|
|
|
|
def main():
|
|
df = load_samples()
|
|
print_table(df)
|
|
display_plot(df)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|