Skip to content

Commit 3213bc2

Browse files
committed
Simply the surface
1 parent b060648 commit 3213bc2

File tree

4 files changed

+85
-91
lines changed

4 files changed

+85
-91
lines changed

examples/gtk-demo/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ edition = "2018"
88

99
[dependencies]
1010
plotters = {path = "../.."}
11-
plotters-cairo = "0.3.*"
12-
cairo-rs = "0.8.*"
13-
gtk = "0.8.*"
14-
gio = "0.8.*"
11+
plotters-cairo = "0.3.1"
12+
cairo-rs = "^0.9"
13+
gtk = "^0.9"
14+
gio = "^0.9"

examples/gtk-demo/src/main.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,31 @@ fn build_ui(app: &gtk::Application) {
1313
let root = CairoBackend::new(cr, (500, 500)).unwrap().into_drawing_area();
1414

1515
root.fill(&WHITE).unwrap();
16+
let root = root.margin(25, 25, 25, 25);
17+
1618

1719
let mut chart = ChartBuilder::on(&root)
1820
.caption("This is a test", ("sans-serif", 20))
19-
.x_label_area_size(40)
20-
.y_label_area_size(40)
21-
.build_cartesian_2d(0..100, 0..100)
21+
.build_cartesian_3d(0.0..100.0, 0.0..100.0, 0.0..100.0)
2222
.unwrap();
2323

24-
chart.configure_mesh()
24+
chart.with_projection(|mut p| {
25+
p.scale = 0.9;
26+
p.into_matrix()
27+
});
28+
29+
chart.configure_axes()
2530
.draw()
2631
.unwrap();
2732

33+
chart.draw_series(
34+
SurfaceSeries::xoz(
35+
(0..100).map(|n| n as f64),
36+
(0..100).map(|n| n as f64),
37+
|x,z| ((x - z) / 10.0).sin() * 20.0 + 50.0,
38+
)
39+
).unwrap();
40+
2841
Inhibit(false)
2942
})
3043
}

examples/tick_control.rs

Lines changed: 59 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ use plotters::prelude::*;
33
use std::fs::File;
44
use std::io::BufReader;
55

6+
use chrono::NaiveDate;
7+
use std::str::FromStr;
8+
69
#[derive(serde_derive::Deserialize)]
710
struct DailyData {
11+
date: String,
812
#[serde(default)]
9-
new_cases: f64,
13+
new_cases_smoothed_per_million: f64,
1014
#[serde(default)]
11-
total_cases: f64,
15+
total_cases_per_million: f64,
1216
}
1317

1418
#[derive(serde_derive::Deserialize)]
@@ -18,65 +22,68 @@ struct CountryData {
1822

1923
fn main() -> Result<(), Box<dyn std::error::Error>> {
2024
let root =
21-
SVGBackend::new("plotters-doc-data/tick_control.svg", (1024, 768)).into_drawing_area();
25+
BitMapBackend::gif("/tmp/tick_control.gif", (800, 600), 100)?.into_drawing_area();
2226

23-
root.fill(&WHITE)?;
27+
for a in 0..200 {
2428

25-
let (upper, lower) = root.split_vertically(750);
29+
root.fill(&WHITE)?;
2630

27-
lower.titled(
28-
"Data Source: https://covid.ourworldindata.org/data/owid-covid-data.json",
29-
("sans-serif", 10).into_font().color(&BLACK.mix(0.5)),
30-
)?;
3131

32-
let mut chart = ChartBuilder::on(&upper)
33-
.caption("World COVID-19 Cases", ("sans-serif", (5).percent_height()))
34-
.set_label_area_size(LabelAreaPosition::Left, (8).percent())
35-
.set_label_area_size(LabelAreaPosition::Bottom, (4).percent())
36-
.margin((1).percent())
37-
.build_cartesian_2d(
38-
(20u32..5000_0000u32)
39-
.log_scale()
40-
.with_key_points(vec![50, 100, 1000, 10000, 100000, 1000000, 10000000]),
41-
(0u32..50_0000u32)
42-
.log_scale()
43-
.with_key_points(vec![10, 50, 100, 1000, 10000, 100000, 200000]),
44-
)?;
32+
let mut chart = ChartBuilder::on(&root)
33+
.set_label_area_size(LabelAreaPosition::Left, (8).percent())
34+
.set_label_area_size(LabelAreaPosition::Bottom, (6).percent())
35+
.margin((1).percent())
36+
.build_cartesian_3d(
37+
(20u32..10_0000u32)
38+
.log_scale()
39+
.with_key_points(vec![50, 100, 200, 500, 1000, 10000]),
40+
(0u32..1000u32)
41+
.log_scale()
42+
.with_key_points(vec![2, 5, 10, 20, 50, 100, 200]),
43+
NaiveDate::from_ymd(2020, 1, 1)..NaiveDate::from_ymd(2020, 9, 5),
44+
)?;
45+
46+
chart.with_projection(|mut pb| {
47+
pb.yaw = (1.57 - a as f64 / 100.0 * 1.57).abs();
48+
pb.into_matrix()
49+
});
50+
51+
chart
52+
.configure_axes()
53+
.draw()?;
4554

46-
chart
47-
.configure_mesh()
48-
.x_desc("Total Cases")
49-
.y_desc("New Cases")
50-
.draw()?;
55+
let data: std::collections::HashMap<String, CountryData> = serde_json::from_reader(
56+
BufReader::new(File::open("plotters-doc-data/covid-data.json")?),
57+
)?;
5158

52-
let data: std::collections::HashMap<String, CountryData> = serde_json::from_reader(
53-
BufReader::new(File::open("plotters-doc-data/covid-data.json")?),
54-
)?;
59+
for (idx, &series) in ["USA", "CHN"]
60+
.iter()
61+
.enumerate()
62+
{
63+
let color = Palette99::pick(idx).mix(1.0);
64+
chart
65+
.draw_series(LineSeries::new(
66+
data[series].data.iter().map(
67+
|DailyData {
68+
date,
69+
new_cases_smoothed_per_million,
70+
total_cases_per_million,
71+
..
72+
}| (*total_cases_per_million as u32, *new_cases_smoothed_per_million as u32, chrono::NaiveDate::from_str(date).unwrap(),),
73+
),
74+
color.stroke_width(1),
75+
))?
76+
.label(series)
77+
.legend(move |(x, y)| Rectangle::new([(x, y - 5), (x + 10, y + 5)], color.filled()));
78+
}
5579

56-
for (idx, &series) in ["CHN", "USA", "RUS", "JPN", "DEU", "IND", "OWID_WRL"]
57-
.iter()
58-
.enumerate()
59-
{
60-
let color = Palette99::pick(idx).mix(0.9);
6180
chart
62-
.draw_series(LineSeries::new(
63-
data[series].data.iter().map(
64-
|&DailyData {
65-
new_cases,
66-
total_cases,
67-
..
68-
}| (total_cases as u32, new_cases as u32),
69-
),
70-
color.stroke_width(3),
71-
))?
72-
.label(series)
73-
.legend(move |(x, y)| Rectangle::new([(x, y - 5), (x + 10, y + 5)], color.filled()));
74-
}
81+
.configure_series_labels()
82+
.border_style(&BLACK)
83+
.draw()?;
7584

76-
chart
77-
.configure_series_labels()
78-
.border_style(&BLACK)
79-
.draw()?;
85+
root.present()?;
86+
}
8087

8188
Ok(())
8289
}

src/series/surface.rs

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ where
6161
free_var_2: Vec<D::Input2Type>,
6262
surface_f: SurfaceFunc,
6363
style: StyleConfig<'a, D::OutputType>,
64-
adv: bool,
6564
vidx_1: usize,
6665
vidx_2: usize,
6766
_phantom: PhantomData<(X, Y, Z, D)>,
@@ -82,7 +81,6 @@ where
8281
free_var_2: second_iter.collect(),
8382
surface_f: func,
8483
style: StyleConfig::Fixed(BLUE.mix(0.4).filled()),
85-
adv: true,
8684
vidx_1: 0,
8785
vidx_2: 0,
8886
_phantom: PhantomData,
@@ -99,31 +97,6 @@ where
9997
self
10098
}
10199

102-
fn get_next_free_value_2(&mut self) -> Option<[D::Input2Type; 2]>
103-
where
104-
D::Input2Type: Clone,
105-
{
106-
if self.adv {
107-
if self.vidx_2 + 1 < self.free_var_2.len() {
108-
self.vidx_2 += 1;
109-
return Some([
110-
self.free_var_2[self.vidx_2 - 1].clone(),
111-
self.free_var_2[self.vidx_2].clone(),
112-
]);
113-
}
114-
self.vidx_2 += 1;
115-
} else {
116-
if self.vidx_2 > 1 {
117-
self.vidx_2 -= 1;
118-
return Some([
119-
self.free_var_2[self.vidx_2 - 1].clone(),
120-
self.free_var_2[self.vidx_2].clone(),
121-
]);
122-
}
123-
self.vidx_2 = self.vidx_2.max(1) - 1;
124-
}
125-
None
126-
}
127100
}
128101

129102
macro_rules! impl_constructor {
@@ -158,18 +131,19 @@ where
158131
{
159132
type Item = Polygon<(X, Y, Z)>;
160133
fn next(&mut self) -> Option<Self::Item> {
161-
let (b0, b1) = if let Some([b0, b1]) = self.get_next_free_value_2() {
134+
let (b0, b1) = if let (Some(b0), Some(b1)) = (self.free_var_2.get(self.vidx_2), self.free_var_2.get(self.vidx_2 + 1)) {
135+
self.vidx_2 += 1;
162136
(b0, b1)
163137
} else {
164138
self.vidx_1 += 1;
165-
self.adv = !self.adv;
166-
if let Some([b0, b1]) = self.get_next_free_value_2() {
139+
self.vidx_2 = 1;
140+
if let (Some(b0), Some(b1)) = (self.free_var_2.get(0), self.free_var_2.get(1)) {
167141
(b0, b1)
168142
} else {
169143
return None;
170144
}
171145
};
172-
146+
173147
match (
174148
self.free_var_1.get(self.vidx_1),
175149
self.free_var_1.get(self.vidx_1 + 1),

0 commit comments

Comments
 (0)