blob: aca6e719db423b84f4bf56c322d3236eb8611af2 [file] [log] [blame]
// Data is pulled from https://covid.ourworldindata.org/data/owid-covid-data.json
use plotters::prelude::*;
use std::fs::File;
use std::io::BufReader;
#[derive(serde_derive::Deserialize)]
struct DailyData {
#[serde(default)]
new_cases: f64,
#[serde(default)]
total_cases: f64,
}
#[derive(serde_derive::Deserialize)]
struct CountryData {
data: Vec<DailyData>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let root =
SVGBackend::new("plotters-doc-data/tick_control.svg", (1024, 768)).into_drawing_area();
root.fill(&WHITE)?;
let (upper, lower) = root.split_vertically(750);
lower.titled(
"Data Source: https://covid.ourworldindata.org/data/owid-covid-data.json",
("sans-serif", 10).into_font().color(&BLACK.mix(0.5)),
)?;
let mut chart = ChartBuilder::on(&upper)
.caption("World COVID-19 Cases", ("sans-serif", (5).percent_height()))
.set_label_area_size(LabelAreaPosition::Left, (8).percent())
.set_label_area_size(LabelAreaPosition::Bottom, (4).percent())
.margin((1).percent())
.build_cartesian_2d(
(20u32..5000_0000u32)
.log_scale()
.with_key_points(vec![50, 100, 1000, 10000, 100000, 1000000, 10000000]),
(0u32..50_0000u32)
.log_scale()
.with_key_points(vec![10, 50, 100, 1000, 10000, 100000, 200000]),
)?;
chart
.configure_mesh()
.x_desc("Total Cases")
.y_desc("New Cases")
.draw()?;
let data: std::collections::HashMap<String, CountryData> = serde_json::from_reader(
BufReader::new(File::open("plotters-doc-data/covid-data.json")?),
)?;
for (idx, &series) in ["CHN", "USA", "RUS", "JPN", "DEU", "IND", "OWID_WRL"]
.iter()
.enumerate()
{
let color = Palette99::pick(idx).mix(0.9);
chart
.draw_series(LineSeries::new(
data[series].data.iter().map(
|&DailyData {
new_cases,
total_cases,
..
}| (total_cases as u32, new_cases as u32),
),
color.stroke_width(3),
))?
.label(series)
.legend(move |(x, y)| Rectangle::new([(x, y - 5), (x + 10, y + 5)], color.filled()));
}
chart
.configure_series_labels()
.border_style(&BLACK)
.draw()?;
Ok(())
}
#[test]
fn entry_point() {
main().unwrap()
}