def test_declarative_sfc_obs_changes(ccrs): """Test making a surface observation plot, changing the field.""" data = pd.read_csv(get_test_data('SFC_obs.csv', as_file_obj=False), infer_datetime_format=True, parse_dates=['valid']) obs = PlotObs() obs.data = data obs.time = datetime(1993, 3, 12, 12) obs.level = None obs.fields = ['tmpf'] obs.colors = ['black'] obs.time_window = timedelta(minutes=15) # Panel for plot with Map features panel = MapPanel() panel.layout = (1, 1, 1) panel.projection = ccrs.PlateCarree() panel.area = 'in' panel.layers = ['states'] panel.plots = [obs] panel.title = f'Surface Observations for {obs.time}' # Bringing it all together pc = PanelContainer() pc.size = (10, 10) pc.panels = [panel] pc.draw() obs.fields = ['dwpf'] obs.colors = ['green'] return pc.figure
def test_declarative_title_fontsize(): """Test adjusting the font size of a MapPanel's title text.""" data = xr.open_dataset(get_test_data('NAM_test.nc', as_file_obj=False)) contour = ContourPlot() contour.data = data contour.field = 'Geopotential_height_isobaric' contour.level = 300 * units.hPa contour.linewidth = 2 contour.contours = list(range(0, 2000, 12)) contour.scale = 1e-1 panel = MapPanel() panel.area = (-124, -72, 20, 53) panel.projection = 'lcc' panel.layers = ['coastline', 'borders', 'usstates'] panel.plots = [contour] panel.title = '300 mb Geopotential Height' panel.title_fontsize = 20 pc = PanelContainer() pc.size = (8, 8) pc.panels = [panel] pc.draw() return pc.figure
def test_copy(): """Test that the copy method works for all classes in `declarative.py`.""" # Copies of plot objects objects = [ImagePlot(), ContourPlot(), FilledContourPlot(), BarbPlot(), PlotObs(), PlotGeometry()] for obj in objects: obj.time = datetime.now() copied_obj = obj.copy() assert obj is not copied_obj assert obj.time == copied_obj.time # Copies of MapPanel and PanelContainer obj = MapPanel() obj.title = 'Sample Text' copied_obj = obj.copy() assert obj is not copied_obj assert obj.title == copied_obj.title obj = PanelContainer() obj.size = (10, 10) copied_obj = obj.copy() assert obj is not copied_obj assert obj.size == copied_obj.size # Copies of plots in MapPanels should not point to same location in memory obj = MapPanel() obj.plots = [PlotObs(), PlotGeometry(), BarbPlot(), FilledContourPlot(), ContourPlot(), ImagePlot()] copied_obj = obj.copy() for i in range(len(obj.plots)): assert obj.plots[i] is not copied_obj.plots[i]
def test_attribute_error_station(ccrs): """Make sure we get a useful error when the station variable is not found.""" data = pd.read_csv(get_test_data('SFC_obs.csv', as_file_obj=False), infer_datetime_format=True, parse_dates=['valid']) data.rename(columns={'station': 'location'}, inplace=True) obs = PlotObs() obs.data = data obs.time = datetime(1993, 3, 12, 12) obs.level = None obs.fields = ['tmpf'] obs.time_window = timedelta(minutes=15) # Panel for plot with Map features panel = MapPanel() panel.layout = (1, 1, 1) panel.projection = ccrs.PlateCarree() panel.area = 'in' panel.layers = ['states'] panel.plots = [obs] panel.title = f'Surface Observations for {obs.time}' # Bringing it all together pc = PanelContainer() pc.size = (10, 10) pc.panels = [panel] with pytest.raises(AttributeError): pc.draw()
def test_declarative_image(): """Test making an image plot.""" data = xr.open_dataset(GiniFile(get_test_data('NHEM-MULTICOMP_1km_IR_20151208_2100.gini'))) img = ImagePlot() img.data = data.metpy.parse_cf('IR') img.colormap = 'Greys_r' panel = MapPanel() panel.title = 'Test' panel.plots = [img] pc = PanelContainer() pc.panel = panel pc.draw() assert panel.ax.get_title() == 'Test' return pc.figure
def test_declarative_plot_geometry_polygons(): """Test that `PlotGeometry` correctly plots MultiPolygon and Polygon objects.""" from shapely.geometry import MultiPolygon, Polygon # MultiPolygons and Polygons to plot slgt_risk_polygon = MultiPolygon([Polygon( [(-87.43, 41.86), (-91.13, 41.39), (-95.24, 40.99), (-97.47, 40.4), (-98.39, 41.38), (-96.54, 42.44), (-94.02, 44.48), (-92.62, 45.48), (-89.49, 45.91), (-86.38, 44.92), (-86.26, 43.37), (-86.62, 42.45), (-87.43, 41.86), ]), Polygon( [(-74.02, 42.8), (-72.01, 43.08), (-71.42, 42.77), (-71.76, 42.29), (-72.73, 41.89), (-73.89, 41.93), (-74.4, 42.28), (-74.02, 42.8), ])]) enh_risk_polygon = Polygon( [(-87.42, 43.67), (-88.44, 42.65), (-90.87, 41.92), (-94.63, 41.84), (-95.13, 42.22), (-95.23, 42.54), (-94.79, 43.3), (-92.81, 43.99), (-90.62, 44.55), (-88.51, 44.61), (-87.42, 43.67)]) # Plot geometry, set colors and labels geo = PlotGeometry() geo.geometry = [slgt_risk_polygon, enh_risk_polygon] geo.stroke = ['#DDAA00', '#FF6600'] geo.fill = None geo.labels = ['SLGT', 'ENH'] geo.label_facecolor = ['#FFE066', '#FFA366'] geo.label_edgecolor = ['#DDAA00', '#FF6600'] geo.label_fontsize = 'large' # Place plot in a panel and container panel = MapPanel() panel.area = [-125, -70, 20, 55] panel.projection = 'lcc' panel.title = ' ' panel.layers = ['coastline', 'borders', 'usstates'] panel.plots = [geo] pc = PanelContainer() pc.size = (12, 12) pc.panels = [panel] pc.draw() return pc.figure
def test_declarative_plot_geometry_lines(ccrs): """Test that `PlotGeometry` correctly plots MultiLineString and LineString objects.""" from shapely.geometry import LineString, MultiLineString # LineString and MultiLineString to plot irma_fcst = LineString([(-52.3, 16.9), (-53.9, 16.7), (-56.2, 16.6), (-58.6, 17.0), (-61.2, 17.8), (-63.9, 18.7), (-66.8, 19.6), (-72.0, 21.0), (-76.5, 22.0)]) irma_fcst_shadow = MultiLineString([ LineString([(-52.3, 17.15), (-53.9, 16.95), (-56.2, 16.85), (-58.6, 17.25), (-61.2, 18.05), (-63.9, 18.95), (-66.8, 19.85), (-72.0, 21.25), (-76.5, 22.25)]), LineString([(-52.3, 16.65), (-53.9, 16.45), (-56.2, 16.35), (-58.6, 16.75), (-61.2, 17.55), (-63.9, 18.45), (-66.8, 19.35), (-72.0, 20.75), (-76.5, 21.75)]) ]) # Plot geometry, set colors and labels geo = PlotGeometry() geo.geometry = [irma_fcst, irma_fcst_shadow] geo.fill = None geo.stroke = 'green' geo.labels = ['Irma', '+/- 0.25 deg latitude'] geo.label_facecolor = None # Place plot in a panel and container panel = MapPanel() panel.area = [-85, -45, 12, 25] panel.projection = ccrs.PlateCarree() panel.layers = ['coastline', 'borders', 'usstates'] panel.title = 'Hurricane Irma Forecast' panel.plots = [geo] pc = PanelContainer() pc.size = (12, 12) pc.panels = [panel] pc.draw() return pc.figure
wind_geo = PlotGeometry() wind_geo.geometry = wind_data['geometry'] wind_geo.fill = wind_data['fill'] wind_geo.stroke = 'none' ########################### # Plot the cities from the 'geometry' column, marked with diamonds ('D'). Label each point # with the name of the city, and it's probability of tropical-storm-force winds on the line # below. Points are set to plot in white and the font color is set to black. city_geo = PlotGeometry() city_geo.geometry = cities['geometry'] city_geo.marker = 'D' city_geo.labels = cities['NAME'] + '\n(' + cities['PERCENTAGE'] + ')' city_geo.fill = 'white' city_geo.label_facecolor = 'black' ########################### # Add the geometry plots to a panel and container. Finally, we are left with a complete plot of # wind speed probabilities, along with some select cities and their specific probabilities. panel = MapPanel() panel.title = 'NHC 5-Day Tropical-Storm-Force Wind Probabilities (Valid 12z Aug 20 2021)' panel.plots = [wind_geo, city_geo] panel.area = [-90, -52, 27, 48] panel.projection = 'mer' panel.layers = ['lakes', 'land', 'ocean', 'states', 'coastline', 'borders'] pc = PanelContainer() pc.size = (12, 10) pc.panels = [panel] pc.show()
get_test_data('spc_day1otlk_20210317_1200_lyr.geojson')) ########################### # Preview the data. day1_outlook ########################### # Plot the shapes from the 'geometry' column. Give the shapes their fill and stroke color by # providing the 'fill' and 'stroke' columns. Use text from the 'LABEL' column as labels for the # shapes. geo = PlotGeometry() geo.geometry = day1_outlook['geometry'] geo.fill = day1_outlook['fill'] geo.stroke = day1_outlook['stroke'] geo.labels = day1_outlook['LABEL'] geo.label_fontsize = 'large' ########################### # Add the geometry plot to a panel and container. panel = MapPanel() panel.title = 'SPC Day 1 Convective Outlook (Valid 12z Mar 17 2021)' panel.plots = [geo] panel.area = [-120, -75, 25, 50] panel.projection = 'lcc' panel.layers = ['lakes', 'land', 'ocean', 'states', 'coastline', 'borders'] pc = PanelContainer() pc.size = (12, 8) pc.panels = [panel] pc.show()
narr = xr.open_dataset(get_test_data('narr_example.nc', as_file_obj=False)) ########################### # Create a contour plot of temperature contour = ContourPlot() contour.data = narr contour.field = 'Temperature' contour.level = 850 * units.hPa contour.linecolor = 'red' contour.contours = 15 ########################### # Create an image plot of Geopotential height img = ImagePlot() img.data = narr img.field = 'Geopotential_height' img.level = 850 * units.hPa ########################### # Plot the data on a map panel = MapPanel() panel.area = 'us' panel.layers = ['coastline', 'borders', 'states', 'rivers', 'ocean', 'land'] panel.title = 'NARR Example' panel.plots = [contour, img] pc = PanelContainer() pc.size = (10, 8) pc.panels = [panel] pc.show()
########################### # Create a contour plot of temperature contour = ContourPlot() contour.data = narr contour.field = 'Temperature' contour.level = 850 * units.hPa contour.linecolor = 'red' contour.contours = 15 ########################### # Create an image plot of Geopotential height img = ImagePlot() img.data = narr img.field = 'Geopotential_height' img.level = 850 * units.hPa ########################### # Plot the data on a map panel = MapPanel() panel.area = 'us' panel.layers = ['coastline', 'borders', 'states', 'rivers', 'ocean', 'land'] panel.title = 'NARR Example' panel.plots = [contour, img] pc = PanelContainer() pc.size = (10, 8) pc.panels = [panel] pc.show()