plotly_patched/
heat_map.rs

1//! Heat-map plot
2
3use crate::common::{Calendar, ColorBar, ColorScale, Dim, HoverInfo, Label, PlotType};
4use crate::private;
5use crate::Trace;
6use serde::Serialize;
7
8#[derive(Serialize, Debug, Default)]
9pub struct HeatMap<Z, X, Y>
10where
11    X: Serialize + Default,
12    Y: Serialize + Default,
13    Z: Serialize + Default,
14{
15    r#type: PlotType,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    name: Option<String>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    visible: Option<bool>,
20    #[serde(skip_serializing_if = "Option::is_none", rename = "showlegend")]
21    show_legend: Option<bool>,
22    #[serde(skip_serializing_if = "Option::is_none", rename = "legendgroup")]
23    legend_group: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    opacity: Option<f64>,
26    x: Option<Vec<X>>,
27    y: Option<Vec<Y>>,
28    z: Vec<Z>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    text: Option<Vec<String>>,
31    #[serde(skip_serializing_if = "Option::is_none", rename = "hovertext")]
32    hover_text: Option<Vec<String>>,
33    #[serde(skip_serializing_if = "Option::is_none", rename = "hoverinfo")]
34    hover_info: Option<HoverInfo>,
35    #[serde(skip_serializing_if = "Option::is_none", rename = "hovertemplate")]
36    hover_template: Option<Dim<String>>,
37    #[serde(skip_serializing_if = "Option::is_none", rename = "xaxis")]
38    x_axis: Option<String>,
39    #[serde(skip_serializing_if = "Option::is_none", rename = "yaxis")]
40    y_axis: Option<String>,
41    #[serde(skip_serializing_if = "Option::is_none", rename = "colorbar")]
42    color_bar: Option<ColorBar>,
43    #[serde(skip_serializing_if = "Option::is_none", rename = "autocolorscale")]
44    auto_color_scale: Option<bool>,
45    #[serde(skip_serializing_if = "Option::is_none", rename = "colorscale")]
46    color_scale: Option<ColorScale>,
47    #[serde(skip_serializing_if = "Option::is_none", rename = "showscale")]
48    show_scale: Option<bool>,
49    #[serde(skip_serializing_if = "Option::is_none", rename = "reversescale")]
50    reverse_scale: Option<bool>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    zauto: Option<bool>,
53    #[serde(skip_serializing_if = "Option::is_none", rename = "zhoverformat")]
54    zhover_format: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    zmax: Option<Z>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    zmid: Option<Z>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    zmin: Option<Z>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    zsmooth: Option<String>,
63    #[serde(skip_serializing_if = "Option::is_none", rename = "connectgaps")]
64    connect_gaps: Option<bool>,
65    #[serde(skip_serializing_if = "Option::is_none", rename = "hoverlabel")]
66    hover_label: Option<Label>,
67    #[serde(skip_serializing_if = "Option::is_none", rename = "hoverongaps")]
68    hover_on_gaps: Option<bool>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    transpose: Option<bool>,
71    #[serde(skip_serializing_if = "Option::is_none", rename = "xcalendar")]
72    x_calendar: Option<Calendar>,
73    #[serde(skip_serializing_if = "Option::is_none", rename = "ycalendar")]
74    y_calendar: Option<Calendar>,
75}
76
77impl<Z> HeatMap<Z, f64, f64>
78where
79    Z: Serialize + Default,
80{
81    pub fn new_z(z: Vec<Z>) -> Box<HeatMap<Z, f64, f64>> {
82        Box::new(HeatMap {
83            z,
84            r#type: PlotType::HeatMap,
85            ..Default::default()
86        })
87    }
88}
89
90impl<X, Y, Z> HeatMap<Z, X, Y>
91where
92    X: Serialize + Default,
93    Y: Serialize + Default,
94    Z: Serialize + Default,
95{
96    pub fn new(x: Vec<X>, y: Vec<Y>, z: Vec<Z>) -> Box<HeatMap<Z, X, Y>> {
97        Box::new(HeatMap {
98            x: Some(x),
99            y: Some(y),
100            z,
101            r#type: PlotType::HeatMap,
102            ..Default::default()
103        })
104    }
105
106    pub fn name(mut self, name: &str) -> Box<HeatMap<Z, X, Y>> {
107        self.name = Some(name.to_owned());
108        Box::new(self)
109    }
110
111    pub fn visible(mut self, visible: bool) -> Box<HeatMap<Z, X, Y>> {
112        self.visible = Some(visible);
113        Box::new(self)
114    }
115
116    pub fn show_legend(mut self, show_legend: bool) -> Box<HeatMap<Z, X, Y>> {
117        self.show_legend = Some(show_legend);
118        Box::new(self)
119    }
120
121    pub fn legend_group(mut self, legend_group: &str) -> Box<HeatMap<Z, X, Y>> {
122        self.legend_group = Some(legend_group.to_owned());
123        Box::new(self)
124    }
125
126    pub fn opacity(mut self, opacity: f64) -> Box<HeatMap<Z, X, Y>> {
127        self.opacity = Some(opacity);
128        Box::new(self)
129    }
130
131    pub fn text<S: AsRef<str>>(mut self, text: Vec<S>) -> Box<HeatMap<Z, X, Y>> {
132        let text = private::owned_string_vector(text);
133        self.text = Some(text);
134        Box::new(self)
135    }
136
137    pub fn hover_text<S: AsRef<str>>(mut self, hover_text: Vec<S>) -> Box<HeatMap<Z, X, Y>> {
138        let hover_text = private::owned_string_vector(hover_text);
139        self.hover_text = Some(hover_text);
140        Box::new(self)
141    }
142
143    pub fn hover_info(mut self, hover_info: HoverInfo) -> Box<HeatMap<Z, X, Y>> {
144        self.hover_info = Some(hover_info);
145        Box::new(self)
146    }
147
148    pub fn hover_template(mut self, hover_template: &str) -> Box<HeatMap<Z, X, Y>> {
149        self.hover_template = Some(Dim::Scalar(hover_template.to_owned()));
150        Box::new(self)
151    }
152
153    pub fn x_axis(mut self, axis: &str) -> Box<HeatMap<Z, X, Y>> {
154        self.x_axis = Some(axis.to_owned());
155        Box::new(self)
156    }
157
158    pub fn y_axis(mut self, axis: &str) -> Box<HeatMap<Z, X, Y>> {
159        self.y_axis = Some(axis.to_owned());
160        Box::new(self)
161    }
162
163    pub fn hover_template_array<S: AsRef<str>>(
164        mut self,
165        hover_template: Vec<S>,
166    ) -> Box<HeatMap<Z, X, Y>> {
167        let hover_template = private::owned_string_vector(hover_template);
168        self.hover_template = Some(Dim::Vector(hover_template));
169        Box::new(self)
170    }
171
172    pub fn color_bar(mut self, color_bar: ColorBar) -> Box<HeatMap<Z, X, Y>> {
173        self.color_bar = Some(color_bar);
174        Box::new(self)
175    }
176
177    pub fn auto_color_scale(mut self, auto_color_scale: bool) -> Box<HeatMap<Z, X, Y>> {
178        self.auto_color_scale = Some(auto_color_scale);
179        Box::new(self)
180    }
181
182    pub fn color_scale(mut self, color_scale: ColorScale) -> Box<HeatMap<Z, X, Y>> {
183        self.color_scale = Some(color_scale);
184        Box::new(self)
185    }
186
187    pub fn show_scale(mut self, show_scale: bool) -> Box<HeatMap<Z, X, Y>> {
188        self.show_scale = Some(show_scale);
189        Box::new(self)
190    }
191
192    pub fn reverse_scale(mut self, reverse_scale: bool) -> Box<HeatMap<Z, X, Y>> {
193        self.reverse_scale = Some(reverse_scale);
194        Box::new(self)
195    }
196
197    pub fn zauto(mut self, zauto: bool) -> Box<HeatMap<Z, X, Y>> {
198        self.zauto = Some(zauto);
199        Box::new(self)
200    }
201
202    pub fn zhover_format(mut self, zhover_format: &str) -> Box<HeatMap<Z, X, Y>> {
203        self.zhover_format = Some(zhover_format.to_owned());
204        Box::new(self)
205    }
206
207    pub fn zmax(mut self, zmax: Z) -> Box<HeatMap<Z, X, Y>> {
208        self.zmax = Some(zmax);
209        Box::new(self)
210    }
211
212    pub fn zmid(mut self, zmid: Z) -> Box<HeatMap<Z, X, Y>> {
213        self.zmid = Some(zmid);
214        Box::new(self)
215    }
216
217    pub fn zmin(mut self, zmin: Z) -> Box<HeatMap<Z, X, Y>> {
218        self.zmin = Some(zmin);
219        Box::new(self)
220    }
221
222    pub fn zsmooth(mut self, zsmooth: &str) -> Box<HeatMap<Z, X, Y>> {
223        self.zsmooth = Some(zsmooth.to_owned());
224        Box::new(self)
225    }
226
227    pub fn connect_gaps(mut self, connect_gaps: bool) -> Box<HeatMap<Z, X, Y>> {
228        self.connect_gaps = Some(connect_gaps);
229        Box::new(self)
230    }
231
232    pub fn hover_label(mut self, hover_label: Label) -> Box<HeatMap<Z, X, Y>> {
233        self.hover_label = Some(hover_label);
234        Box::new(self)
235    }
236
237    pub fn hover_on_gaps(mut self, hover_on_gaps: bool) -> Box<HeatMap<Z, X, Y>> {
238        self.hover_on_gaps = Some(hover_on_gaps);
239        Box::new(self)
240    }
241
242    pub fn transpose(mut self, transpose: bool) -> Box<HeatMap<Z, X, Y>> {
243        self.transpose = Some(transpose);
244        Box::new(self)
245    }
246
247    pub fn x_calendar(mut self, calendar: Calendar) -> Box<HeatMap<Z, X, Y>> {
248        self.x_calendar = Some(calendar);
249        Box::new(self)
250    }
251
252    pub fn y_calendar(mut self, calendar: Calendar) -> Box<HeatMap<Z, X, Y>> {
253        self.y_calendar = Some(calendar);
254        Box::new(self)
255    }
256}
257
258impl<X, Y, Z> Trace for HeatMap<Z, X, Y>
259where
260    X: Serialize + Default,
261    Y: Serialize + Default,
262    Z: Serialize + Default,
263{
264    fn serialize(&self) -> String {
265        serde_json::to_string(&self).unwrap()
266    }
267}