1use 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}