When I build or install a new antenna, I always run a series of tests. Like everyone else, I look at the resonant frequency and SWR. But to see how the antenna is performing, I run WSPR1 for a few days. Then I use the data collected by WSPR Net to draw the graphs that can be seen in my previous post about the 80-meter antenna I have installed in my backyard.
With these WSPR graphs, I can see where and in what direction I beam my signal, as well as how far. The violin plot also gives me information on the skip zones. These graphs are a handy tool for any antenna designer to view an antenna's performance.
There is one thing that always puzzled me: no matter the radiation pattern of my antenna, my system seemed to perform poorly in some directions. My hunch was that the antenna wasn't the issue, but that the ham radio operator density in some areas was sparse.
To test that hypothesis, I grabbed Python, my favorite programming language. I downloaded the WSPR raw data for the entire month of April 2020 and quickly wrote the following program to map where my fellow active ham radio operators are located.
As you can see on world map, the large majority of the activity is in Europe and the US. The US has many more licensed operators, but Europeans seem to be more active.
On the US map, the majority of the activity is on the East Coast. Illinois and Texas seem active as well. In general, the hot spots are around urban areas. In California, the most active region is the San Francisco bay. Even Los Angeles, with its large population, is less active.
I have quickly hacked this short python program to draw the heat-maps. The program uses the NumPy, matplotlib, and Basemap extension.
#!/usr/bin/exec python3.7 import csv import logging import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap from maidenhead import grid2latlon FILENAME = 'wsprspots-2020-04.csv' logging.info('Starting...') logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', datefmt='%H:%M:%S', level=logging.INFO) logging.info('Reading data...') lats, lons = ,  with open(FILENAME) as csvfile: spamreader = csv.reader(csvfile) for row in spamreader: for col in (3, 7): lat, lon = grid2latlon(row[col]) lats.append(lat) lons.append(lon) logging.info('Plotting: %d datapoints', len(lats)) fig = plt.figure(figsize=(14, 8)) fig.suptitle('WSPR HEATMAP', fontsize=14, fontweight='bold') fig.text(.02, .02, 'By W6BSD Fred') bmap = Basemap(projection='merc', resolution='l', llcrnrlat=-80, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180) # llcrnrlat=22, urcrnrlat=52, llcrnrlon=-130, urcrnrlon=-64) bmap.drawcoastlines(color='gray') # 5º boxes lon_bins = np.linspace(-180, 180, 72) lat_bins = np.linspace(-80, 80, 36) logging.info('Histogram') density = np.histogram2d(lats, lons, [lat_bins, lon_bins]) lon_bins_2d, lat_bins_2d = np.meshgrid(lon_bins, lat_bins) xs, ys = bmap(lon_bins_2d, lat_bins_2d) density = np.hstack((density, np.zeros((density.shape, 1)))) density = np.vstack((density, np.zeros((density.shape)))) logging.info('Mesh') # RdBu_r plt.pcolormesh(xs, ys, density, cmap='jet', shading='gouraud') cbar = plt.colorbar(orientation='vertical', shrink=0.625, aspect=20, fraction=0.2, pad=0.02) cbar.set_label('contacts density', size=14) logging.info('Save figure') plt.savefig('WORLD_wspr.png') plt.close()
This method is not perfect because it only uses data from WSPR. Some countries do not run WSPR; for example, I have never seen any spot or report coming from Mexico. FT8 is the most popular communication mode in the ham community. I want to run my program with data from FT8. If anyone of you knows where I could get that data, please send me a message.