Plotting Examples

Built-in functionality

The returned DataFrame from covidcast.signal() can be plotted using the built-in covidcast.plot(). Currently, state, county, hospital referral regions (HRR), and metropolitan statistical area (MSA) geography types are supported.

County-level maps show estimates for each county, and color each state as a single polygon with the megacounty estimates, if available. (Megacounties represent all counties with insufficient sample size to report in that state; see the geographic coding documentation for details.)

>>> import covidcast
>>> from datetime import date
>>> from matplotlib import pyplot as plt
>>> data = covidcast.signal("fb-survey",
...                         "smoothed_cli",
...                         date(2020, 8, 3),
...                         date(2020, 8, 4),
...                         geo_type="county")
>>> covidcast.plot(data)
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-1.png

State-level data can also be mapped:

>>> data = covidcast.signal("fb-survey",
...                         "smoothed_cli",
...                         date(2020, 8, 3),
...                         date(2020, 8, 4),
...                         geo_type="state")
>>> covidcast.plot(data)
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-2.png

Regions where no information is present are presented in light grey, as demonstrated by these MSA and HRR plots.

>>> data = covidcast.signal("fb-survey",
...                         "smoothed_cli",
...                         date(2020, 8, 3),
...                         date(2020, 8, 4),
...                         geo_type="msa")
>>> covidcast.plot(data)
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-3.png
>>> data = covidcast.signal("fb-survey", "smoothed_cli",
...                         date(2020, 8, 3), date(2020, 8, 4),
...                         geo_type="hrr")
>>> covidcast.plot(data)
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-4.png

As an alternative to choropleths, bubble plots can be created with the plot_type="bubble" argument.

>>> covidcast.plot(data, plot_type="bubble")
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-5.png

Additional keyword arguments can also be provided. These correspond to most of the arguments available for the GeoPandas plot() function.

>>> covidcast.plot(data,
...                cmap="viridis",
...                edgecolor="0.8")
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-6.png

The function returns a Matplotlib Figure object which can be stored and altered further.

>>> fig = plotting.plot(data)
>>> fig.set_dpi(100)

Animations

To create an animation, simply pass the signal DataFrame to covidcast.animate(). The following code creates an MP4 file named test_plot.mp4 which animates our daily signal for the month of August.

>>> data = covidcast.signal("fb-survey",
...                         "smoothed_cli",
...                         date(2020, 8, 1),
...                         date(2020, 8, 31),
...                         geo_type = "county")
>>> covidcast.animate(data, "test_plot.mp4")

Video format, frame rate, and resolution are adjustable. Like the static maps, additional plotting keyword arguments can be provided and are passed to covidcast.plot().

>>> covidcast.animate(df,
...                   "test_plot2.mp4",
...                   fps=2,
...                   cmap="viridis")

Further customization

If more control is desired, the signal data can be passed to covidcast.get_geo_df(), which will return a GeoPandas GeoDataFrame with relevant polgons that can be used with the mapping tools provided by that package. The geometry information is sourced from the 2019 US Census Cartographic Boundary Files.

The covidcast.get_geo_df() method can return different joins depending on your use case. By default, it will try to compute the right join between the input data (left side of join) to the geometry data (right side of join), so that the returned GeoDataFrame will contain all the possible geometries with the signal values filled if present. When mapping counties, those that do not have values but have a corresponding megacounty will inherit the megacounty values. To have a singe polygon returned for each megacounty, use the combine_megacounties=True argument.

This operation depends on having only one row of signal information per geographic region. If this is not the the case, you must specify another join with the join_type argument.

>>> data = covidcast.signal("fb-survey",
...                         "smoothed_cli",
...                         date(2020, 8, 4),
...                         date(2020, 8, 4),
...                         geo_type = "county")
>>> covidcast.get_geo_df(data)
     geo_value time_value      issue  lag     value    stderr  sample_size geo_type data_source        signal                                           geometry state_fips
0        24510 2020-08-04 2020-08-06  2.0  0.375601  0.193356     587.6289   county   fb-survey  smoothed_cli  POLYGON ((-76.71131 39.37193, -76.62619 39.372...         24
1        31169 2020-08-04 2020-08-06  2.0  0.928208  0.168783    1059.8130   county   fb-survey  smoothed_cli  POLYGON ((-97.82082 40.35054, -97.36869 40.350...         31
2        37077 2020-08-04 2020-08-06  2.0  0.627742  0.081884    3146.0176   county   fb-survey  smoothed_cli  POLYGON ((-78.80252 36.21349, -78.80235 36.220...         37
3        46091 2020-08-04 2020-08-06  2.0  0.589745  0.161989     778.7429   county   fb-survey  smoothed_cli  POLYGON ((-97.97924 45.76257, -97.97878 45.935...         46
4        39075 2020-08-04 2020-08-06  2.0  0.785641  0.099959    2767.5054   county   fb-survey  smoothed_cli  POLYGON ((-82.22066 40.66758, -82.12620 40.668...         39
...        ...        ...       ...        ...  ...       ...       ...          ...      ...         ...           ...                                                ...        ...
3228     53055 2020-08-04 2020-08-06  2.0  0.440817  0.143404     944.1731   county   fb-survey  smoothed_cli  MULTIPOLYGON (((-122.97714 48.79345, -122.9379...         53
3229     39133 2020-08-04 2020-08-06  2.0  0.040082  0.089324     310.8495   county   fb-survey  smoothed_cli  POLYGON ((-81.39328 41.02544, -81.39322 41.040...         39
3230     08025 2020-08-04 2020-08-06  2.0  0.440306  0.123763    1171.5823   county   fb-survey  smoothed_cli  POLYGON ((-104.05840 38.26084, -104.05392 38.5...         08
3231     13227 2020-08-04 2020-08-06  2.0  1.009511  0.092993    3605.8731   county   fb-survey  smoothed_cli  POLYGON ((-84.65437 34.54895, -84.52139 34.550...         13
3232     21145 2020-08-04 2020-08-06  2.0  1.257862  0.915558     150.4266   county   fb-survey  smoothed_cli  POLYGON ((-88.93308 37.22775, -88.93174 37.227...         21
[3233 rows x 13 columns]

Note that there are 3233 output rows for the 3233 counties present in the Census shapefiles.

>>> covidcast.get_geo_df(covid, join_type="left")
    geo_value time_value      issue  lag     value    stderr  sample_size geo_type data_source        signal                                           geometry state_fips
0       01000 2020-08-04 2020-08-06    2  1.153447  0.136070    1759.8539   county   fb-survey  smoothed_cli                                               None        NaN
1       01001 2020-08-04 2020-08-06    2  0.539568  0.450588     107.9345   county   fb-survey  smoothed_cli  POLYGON ((-86.91759 32.66417, -86.81657 32.660...         01
2       01003 2020-08-04 2020-08-06    2  1.625496  0.522036     455.2964   county   fb-survey  smoothed_cli  POLYGON ((-88.02927 30.22271, -88.02399 30.230...         01
3       01015 2020-08-04 2020-08-06    2  0.000000  0.378788     115.2302   county   fb-survey  smoothed_cli  POLYGON ((-86.14371 33.70913, -86.12388 33.710...         01
4       01051 2020-08-04 2020-08-06    2  0.786565  0.435877     112.5569   county   fb-survey  smoothed_cli  POLYGON ((-86.41333 32.75059, -86.37497 32.753...         01
..        ...        ...        ...  ...       ...       ...          ...      ...         ...           ...                                                ...        ...
840     55141 2020-08-04 2020-08-06    2  1.190476  0.867751     144.3682   county   fb-survey  smoothed_cli  POLYGON ((-90.31605 44.42450, -90.31596 44.424...         55
841     56000 2020-08-04 2020-08-06    2  0.822092  0.254670     628.9937   county   fb-survey  smoothed_cli                                               None        NaN
842     56021 2020-08-04 2020-08-06    2  0.269360  0.315094     197.9646   county   fb-survey  smoothed_cli  POLYGON ((-105.28064 41.33100, -105.27824 41.6...         56
843     56025 2020-08-04 2020-08-06    2  0.170940  0.304654     192.0237   county   fb-survey  smoothed_cli  POLYGON ((-107.54353 42.78156, -107.50142 42.7...         56
844     72000 2020-08-04 2020-08-06    2  0.000000  0.228310     100.9990   county   fb-survey  smoothed_cli                                               None        NaN
[845 rows x 13 columns]

With the left join, there are 845 rows since the signal returned information for 845 counties and megacounties.

With the GeoDataFrame, you can plot various data points in whatever style you prefer. For example, plotting California on August 4, 2020 with a Mercator projection:

>>> CA = geo_data.loc[geo_data.state_fips == "06",:]
>>> CA.to_crs("EPSG:3395")
>>> CA.plot(column="true_value", figsize=(5,5), legend=True)
>>> plt.axis("off")
>>> plt.show()

(Source code, png, hires.png, pdf)

_images/plot_examples-7.png