15. Contour Plots

15.1. Description

Contour plots are a very general plot type somewhat similar to a scatter plot. The axes are specified by the user, and any will do so long as the entire set of x and y locations has some value (i.e. not missing data). The value is then contoured. This type of plot is often used to examine statistics over a series of time or heights. Often, it can be desirable to examine the difference in statistics between two NWP models as a contour plot, as is shown in the example below.

15.2. How-To

Selection of options to produce the plot proceeds approximately counter-clockwise around the METviewer window. The steps to create a contour plot are:

  1. Select the desired database from the “Select databases” pulldown menu at the top margin of the METviewer window.

  2. There are a number of tabs just under the database pulldown menu. Select the ‘Contour’ tab, which is the rightmost tab.

  3. Select the desired variable to calculate statistics for in the “Variable and Statistic” tab. The first pulldown menu lists the variables available in the selected database.

  4. Select the desired statistic to calculate in the second pulldown menu which is to the right of the variable menu. This lists the available attribute statistics in the selected dataset.

  5. Select the Y axis Independent Variable from the first pulldown menu in the section of the same name. There are many options. “FCST_LEV” is used in the included example. In the second pulldown menu to the right of the first are the independent variable options.

  6. It usually does not make sense to mix statistics for different groups. The desired group to calculate statistics over can be specified using the “Fixed Values” section. In the example below, a single domain (category: “VX_MASK”, value: “CONUS”) and a model (category: “MODEL”, value: “HRRR_hrconus”) are chosen. If multiple domains or thresholds were chosen, the statistics would be a summary of all of those cases together, which may not always be desired.

  7. Select the x-axis value in the “X axis Independent Variable” section. For this example, it is the forecast initialization beginning time.

  8. The “Configurations” section contains various options for the contour plot including the color scheme and contour line overlay.

  9. Select the type of statistics summary by selecting either “Summary” or “Aggregation Statistics” button in the “Statistics” section. Aggregated statistics may be selected for certain varieties of statistics. The selection can be made from the leftmost dropdown menu in the “Statistics” section. By default, the median value of all statistics will be plotted. Using the dropdown menu, the mean or sum may be selected instead. Choosing this option will cause a single statistic to be calculated from the individual database lines.

  10. Now enough information has been entered to produce a graph. To do this, click the “Generate Plot” button at the top of the METviewer window (this is in red text). Typically, if a plot is not produced, it is because the database selected does not contain the correct type of data. Also, it is imperative to check the data used for the plot by selecting the “R data” tab on the right hand side, above the plot area. The data from the database that is being used to calculate the statistics is listed in this tab. This tab should be checked to avoid the accidental accumulation of inappropriate database lines. For example, it does not make sense to accumulate statistics over different domains, thresholds, models, etc.

There are many other options for plots, but these are the basics.

15.3. Example

The example is a contour plot of temperature mean error (bias) for one model at different pressure levels over a range of initialization times.

../_images/contour_plot.png

Figure 15.1 Example METviewer contour plot showing temperature bias by pressure level over a series of initialization times.

Here is the associated xml for this example. It can be copied into an empty file and saved to the desktop then uploaded into the system by clicking on the “Load XML” button in the upper-right corner of the GUI. This XML can be downloaded from this link: contour_xml.xml.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<plot_spec>
    <connection>
        <host>mohawk</host>
        <database>mv_hrrr_sseo_test</database>
        <user>******</user>
        <password>******</password>
        <management_system>mariadb</management_system>
    </connection>
    <rscript>/usr/local/R/bin/Rscript</rscript>
    <folders>
        <r_tmpl>/opt/vxwww/tomcat/webapps/metviewer//R_tmpl</r_tmpl>
        <r_work>/opt/vxwww/tomcat/webapps/metviewer//R_work</r_work>
        <plots>/d2/www/dtcenter/met/metviewer_output//plots</plots>
        <data>/d2/www/dtcenter/met/metviewer_output//data</data>
        <scripts>/d2/www/dtcenter/met/metviewer_output//scripts</scripts>
    </folders>
    <plot>
        <template>contour_plot.R_tmpl</template>
        <dep>
            <dep1>
                <fcst_var name="TMP">
                    <stat>ME</stat>
                </fcst_var>
            </dep1>
            <dep2/>
        </dep>
        <series1>
            <field name="fcst_lev">
                <val>P250</val>
                <val>P500</val>
                <val>P700</val>
                <val>P850</val>
                <val>P925</val>
            </field>
        </series1>
        <series2/>
        <plot_fix>
            <field equalize="false" name="vx_mask">
                <set name="vx_mask_0">
                    <val>CONUS</val>
                </set>
            </field>
            <field equalize="false" name="model">
                <set name="model_1">
                    <val>HRRR_hrconus</val>
                </set>
            </field>
        </plot_fix>
        <plot_cond/>
        <indep equalize="false" name="fcst_init_beg">
            <val label="2016-05-18 00" plot_val="">2016-05-18 00:00:00</val>
            <val label="2016-05-18 12" plot_val="">2016-05-18 12:00:00</val>
            <val label="2016-05-19 00" plot_val="">2016-05-19 00:00:00</val>
            <val label="2016-05-19 12" plot_val="">2016-05-19 12:00:00</val>
            <val label="2016-05-20 00" plot_val="">2016-05-20 00:00:00</val>
            <val label="2016-05-20 12" plot_val="">2016-05-20 12:00:00</val>
            <val label="2016-05-21 00" plot_val="">2016-05-21 00:00:00</val>
            <val label="2016-05-21 12" plot_val="">2016-05-21 12:00:00</val>
            <val label="2016-05-22 00" plot_val="">2016-05-22 00:00:00</val>
            <val label="2016-05-22 12" plot_val="">2016-05-22 12:00:00</val>
            <val label="2016-05-23 00" plot_val="">2016-05-23 00:00:00</val>
            <val label="2016-05-23 12" plot_val="">2016-05-23 12:00:00</val>
            <val label="2016-05-24 00" plot_val="">2016-05-24 00:00:00</val>
            <val label="2016-05-24 12" plot_val="">2016-05-24 12:00:00</val>
            <val label="2016-05-25 00" plot_val="">2016-05-25 00:00:00</val>
            <val label="2016-05-25 12" plot_val="">2016-05-25 12:00:00</val>
            <val label="2016-05-26 00" plot_val="">2016-05-26 00:00:00</val>
            <val label="2016-05-26 12" plot_val="">2016-05-26 12:00:00</val>
            <val label="2016-05-27 00" plot_val="">2016-05-27 00:00:00</val>
            <val label="2016-05-27 12" plot_val="">2016-05-27 12:00:00</val>
        </indep>
        <plot_stat>median</plot_stat>
        <tmpl>
            <data_file>plot_20200921_195008.data</data_file>
            <plot_file>plot_20200921_195008.png</plot_file>
            <r_file>plot_20200921_195008.R</r_file>
            <title>Temperature Mean Error, CONUS</title>
            <x_label>Forecast Initialization</x_label>
            <y1_label>Pressure Levels (in hPa)</y1_label>
            <y2_label/>
            <caption/>
            <job_title/>
            <keep_revisions>false</keep_revisions>
            <listdiffseries1>list()</listdiffseries1>
            <listdiffseries2>list()</listdiffseries2>
        </tmpl>
        <execution_type>Rscript</execution_type>
        <event_equal>false</event_equal>
        <vert_plot>false</vert_plot>
        <x_reverse>false</x_reverse>
        <num_stats>false</num_stats>
        <indy1_stag>false</indy1_stag>
        <indy2_stag>false</indy2_stag>
        <grid_on>true</grid_on>
        <sync_axes>false</sync_axes>
        <dump_points1>false</dump_points1>
        <dump_points2>false</dump_points2>
        <log_y1>false</log_y1>
        <log_y2>false</log_y2>
        <varianceinflationfactor>true</varianceinflationfactor>
        <plot_type>png16m</plot_type>
        <plot_height>8.5</plot_height>
        <plot_width>11</plot_width>
        <plot_res>72</plot_res>
        <plot_units>in</plot_units>
        <mar>c(8,4,5,4)</mar>
        <mgp>c(1,1,0)</mgp>
        <cex>1</cex>
        <title_weight>2</title_weight>
        <title_size>1.4</title_size>
        <title_offset>-2</title_offset>
        <title_align>0.5</title_align>
        <xtlab_orient>2</xtlab_orient>
        <xtlab_perp>-0.75</xtlab_perp>
        <xtlab_horiz>0.5</xtlab_horiz>
        <xtlab_freq>0</xtlab_freq>
        <xtlab_size>1</xtlab_size>
        <xlab_weight>1</xlab_weight>
        <xlab_size>1</xlab_size>
        <xlab_offset>5</xlab_offset>
        <xlab_align>0.5</xlab_align>
        <ytlab_orient>1</ytlab_orient>
        <ytlab_perp>0.5</ytlab_perp>
        <ytlab_horiz>0.5</ytlab_horiz>
        <ytlab_size>1</ytlab_size>
        <ylab_weight>1</ylab_weight>
        <ylab_size>1</ylab_size>
        <ylab_offset>-2</ylab_offset>
        <ylab_align>0.5</ylab_align>
        <grid_lty>3</grid_lty>
        <grid_col>#cccccc</grid_col>
        <grid_lwd>1</grid_lwd>
        <grid_x>listX</grid_x>
        <x2tlab_orient>1</x2tlab_orient>
        <x2tlab_perp>1</x2tlab_perp>
        <x2tlab_horiz>0.5</x2tlab_horiz>
        <x2tlab_size>0.8</x2tlab_size>
        <x2lab_size>0.8</x2lab_size>
        <x2lab_offset>-0.5</x2lab_offset>
        <x2lab_align>0.5</x2lab_align>
        <y2tlab_orient>1</y2tlab_orient>
        <y2tlab_perp>0.5</y2tlab_perp>
        <y2tlab_horiz>0.5</y2tlab_horiz>
        <y2tlab_size>1</y2tlab_size>
        <y2lab_size>1</y2lab_size>
        <y2lab_offset>1</y2lab_offset>
        <y2lab_align>0.5</y2lab_align>
        <legend_box>o</legend_box>
        <legend_inset>c(0, -.25)</legend_inset>
        <legend_ncol>3</legend_ncol>
        <legend_size>0.8</legend_size>
        <caption_weight>1</caption_weight>
        <caption_col>#333333</caption_col>
        <caption_size>0.8</caption_size>
        <caption_offset>3</caption_offset>
        <caption_align>0</caption_align>
        <ci_alpha>0.05</ci_alpha>
        <plot_ci>c("none")</plot_ci>
        <show_signif>c(FALSE)</show_signif>
        <plot_disp>c(TRUE)</plot_disp>
        <colors>c("#000000FF")</colors>
        <pch>c(20)</pch>
        <type>c("b")</type>
        <lty>c(1)</lty>
        <lwd>c(1)</lwd>
        <con_series>c(1)</con_series>
        <order_series>c(1)</order_series>
        <plot_cmd/>
        <legend>c("")</legend>
        <y1_lim>c()</y1_lim>
        <x1_lim>c()</x1_lim>
        <y1_bufr>0.04</y1_bufr>
        <y2_lim>c()</y2_lim>
        <contour_intervals/>
        <color_palette>cm.colors</color_palette>
        <add_color_bar>true</add_color_bar>
        <reverse_y>false</reverse_y>
        <reverse_x>false</reverse_x>
        <add_contour_overlay>true</add_contour_overlay>
    </plot>
</plot_spec>