#!/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 . # # 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 seaborn as sns import sys 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(): # (Empty) Plot here 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(0, 90).remove() ax.set_rmax(90.0) ax.set_ylim(0.0, 90.0) plt.tight_layout() plt.show() def main(): df = load_samples() print_table(df) display_plot() if __name__ == "__main__": main()