plotly_patched/common/
mod.rs

1use serde::Serialize;
2
3pub mod color;
4
5use crate::common::color::ColorWrapper;
6use crate::private;
7use crate::private::{to_num_or_string_wrapper, NumOrString, NumOrStringWrapper};
8use color::Color;
9
10#[derive(Serialize, Clone, Debug)]
11#[serde(untagged)]
12pub enum Direction {
13    Increasing { line: Line },
14    Decreasing { line: Line },
15}
16
17#[derive(Serialize, Clone, Debug)]
18pub enum Visible {
19    #[serde(rename = "x")]
20    True,
21    #[serde(rename = "x")]
22    False,
23    #[serde(rename = "x")]
24    LegendOnly,
25}
26
27#[derive(Serialize, Clone, Debug)]
28pub enum HoverInfo {
29    #[serde(rename = "x")]
30    X,
31    #[serde(rename = "y")]
32    Y,
33    #[serde(rename = "z")]
34    Z,
35    #[serde(rename = "x+y")]
36    XAndY,
37    #[serde(rename = "x+z")]
38    XAndZ,
39    #[serde(rename = "y+z")]
40    YAndZ,
41    #[serde(rename = "x+y+z")]
42    XAndYAndZ,
43    #[serde(rename = "text")]
44    Text,
45    #[serde(rename = "name")]
46    Name,
47    #[serde(rename = "all")]
48    All,
49    #[serde(rename = "none")]
50    None,
51    #[serde(rename = "skip")]
52    Skip,
53}
54
55#[derive(Serialize, Clone, Debug)]
56pub enum TextPosition {
57    #[serde(rename = "inside")]
58    Inside,
59    #[serde(rename = "outside")]
60    Outside,
61    #[serde(rename = "auto")]
62    Auto,
63    #[serde(rename = "none")]
64    None,
65}
66
67#[derive(Serialize, Clone, Debug)]
68pub enum ConstrainText {
69    #[serde(rename = "inside")]
70    Inside,
71    #[serde(rename = "outside")]
72    Outside,
73    #[serde(rename = "both")]
74    Both,
75    #[serde(rename = "none")]
76    None,
77}
78
79#[derive(Serialize, Clone, Debug)]
80pub enum Orientation {
81    #[serde(rename = "v")]
82    Vertical,
83    #[serde(rename = "h")]
84    Horizontal,
85}
86
87#[derive(Serialize, Clone, Debug)]
88pub enum GroupNorm {
89    #[serde(rename = "")]
90    Default,
91    #[serde(rename = "fraction")]
92    Fraction,
93    #[serde(rename = "percent")]
94    Percent,
95}
96
97#[derive(Serialize, Clone, Debug)]
98pub enum Fill {
99    #[serde(rename = "tozeroy")]
100    ToZeroY,
101    #[serde(rename = "tozerox")]
102    ToZeroX,
103    #[serde(rename = "tonexty")]
104    ToNextY,
105    #[serde(rename = "tonextx")]
106    ToNextX,
107    #[serde(rename = "toself")]
108    ToSelf,
109    #[serde(rename = "tonext")]
110    ToNext,
111    #[serde(rename = "none")]
112    None,
113}
114
115#[derive(Serialize, Clone, Debug)]
116pub enum Calendar {
117    #[serde(rename = "gregorian")]
118    Gregorian,
119    #[serde(rename = "chinese")]
120    Chinese,
121    #[serde(rename = "coptic")]
122    Coptic,
123    #[serde(rename = "discworld")]
124    DiscWorld,
125    #[serde(rename = "ethiopian")]
126    Ethiopian,
127    #[serde(rename = "hebrew")]
128    Hebrew,
129    #[serde(rename = "islamic")]
130    Islamic,
131    #[serde(rename = "julian")]
132    Julian,
133    #[serde(rename = "mayan")]
134    Mayan,
135    #[serde(rename = "nanakshahi")]
136    Nanakshahi,
137    #[serde(rename = "nepali")]
138    Nepali,
139    #[serde(rename = "persian")]
140    Persian,
141    #[serde(rename = "jalali")]
142    Jalali,
143    #[serde(rename = "taiwan")]
144    Taiwan,
145    #[serde(rename = "thai")]
146    Thai,
147    #[serde(rename = "ummalqura")]
148    Ummalqura,
149}
150
151#[derive(Serialize, Clone, Debug)]
152#[serde(untagged)]
153pub enum Dim<T>
154where
155    T: Serialize,
156{
157    Scalar(T),
158    Vector(Vec<T>),
159}
160
161#[derive(Serialize, Clone, Debug)]
162pub enum PlotType {
163    #[serde(rename = "scatter")]
164    Scatter,
165    #[serde(rename = "scattergl")]
166    ScatterGL,
167    #[serde(rename = "scatter3d")]
168    Scatter3D,
169    #[serde(rename = "bar")]
170    Bar,
171    #[serde(rename = "box")]
172    Box,
173    #[serde(rename = "candlestick")]
174    Candlestick,
175    #[serde(rename = "contour")]
176    Contour,
177    #[serde(rename = "heatmap")]
178    HeatMap,
179    #[serde(rename = "histogram")]
180    Histogram,
181    #[serde(rename = "histogram2dcontour")]
182    Histogram2dContour,
183    #[serde(rename = "ohlc")]
184    Ohlc,
185    #[serde(rename = "surface")]
186    Surface,
187}
188
189impl Default for PlotType {
190    fn default() -> Self {
191        PlotType::Scatter
192    }
193}
194
195#[derive(Serialize, Clone, Debug)]
196pub enum Mode {
197    #[serde(rename = "lines")]
198    Lines,
199    #[serde(rename = "markers")]
200    Markers,
201    #[serde(rename = "text")]
202    Text,
203    #[serde(rename = "lines+markers")]
204    LinesMarkers,
205    #[serde(rename = "lines+text")]
206    LinesText,
207    #[serde(rename = "markers+text")]
208    MarkersText,
209    #[serde(rename = "lines+markers+text")]
210    LinesMarkersText,
211    #[serde(rename = "none")]
212    None,
213}
214
215#[derive(Serialize, Clone, Debug)]
216pub enum Position {
217    #[serde(rename = "top left")]
218    TopLeft,
219    #[serde(rename = "top center")]
220    TopCenter,
221    #[serde(rename = "top right")]
222    TopRight,
223    #[serde(rename = "middle left")]
224    MiddleLeft,
225    #[serde(rename = "middle center")]
226    MiddleCenter,
227    #[serde(rename = "middle right")]
228    MiddleRight,
229    #[serde(rename = "bottom left")]
230    BottomLeft,
231    #[serde(rename = "bottom center")]
232    BottomCenter,
233    #[serde(rename = "bottom right")]
234    BottomRight,
235}
236
237#[derive(Serialize, Clone, Debug)]
238pub enum MarkerSymbol {
239    #[serde(rename = "circle")]
240    Circle,
241    #[serde(rename = "circle-open")]
242    CirleOpen,
243    #[serde(rename = "circle-dot")]
244    CircleDot,
245    #[serde(rename = "circle-open-dot")]
246    CircleOpenDot,
247    #[serde(rename = "square")]
248    Square,
249    #[serde(rename = "square-open")]
250    SquareOpen,
251    #[serde(rename = "square-dot")]
252    SquareDot,
253    #[serde(rename = "square-open-dot")]
254    SquareOpenDot,
255    #[serde(rename = "diamond")]
256    Diamond,
257    #[serde(rename = "diamond-open")]
258    DiamondOpen,
259    #[serde(rename = "diamond-dot")]
260    DiamondDot,
261    #[serde(rename = "diamond-open-dot")]
262    DiamondOpenDot,
263    #[serde(rename = "cross")]
264    Cross,
265    #[serde(rename = "cross-open")]
266    CrossOpen,
267    #[serde(rename = "cross-dot")]
268    CrossDot,
269    #[serde(rename = "cross-open-dot")]
270    CrossOpenDot,
271    #[serde(rename = "x")]
272    X,
273    #[serde(rename = "x-open")]
274    XOpen,
275    #[serde(rename = "x-dot")]
276    XDot,
277    #[serde(rename = "x-open-dot")]
278    XOpenDot,
279    #[serde(rename = "triangle-up")]
280    TriangleUp,
281    #[serde(rename = "triangle-up-open")]
282    TriangleUpOpen,
283    #[serde(rename = "triangle-up-dot")]
284    TriangleUpDot,
285    #[serde(rename = "triangle-up-open-dot")]
286    TriangleUpOpenDot,
287    #[serde(rename = "triangle-down")]
288    TriangleDown,
289    #[serde(rename = "triangle-down-open")]
290    TriangleDownOpen,
291    #[serde(rename = "triangle-down-dot")]
292    TriangleDownDot,
293    #[serde(rename = "triangle-down-open-dot")]
294    TriangleDownOpenDot,
295    #[serde(rename = "triangle-left")]
296    TriangleLeft,
297    #[serde(rename = "triangle-left-open")]
298    TriangleLeftOpen,
299    #[serde(rename = "triangle-left-dot")]
300    TriangleLeftDot,
301    #[serde(rename = "triangle-left-open-dot")]
302    TriangleLeftOpenDot,
303    #[serde(rename = "triangle-right")]
304    TriangleRight,
305    #[serde(rename = "triangle-right-open")]
306    TriangleRightOpen,
307    #[serde(rename = "triangle-right-dot")]
308    TriangleRightDot,
309    #[serde(rename = "triangle-right-open-dot")]
310    TriangleRightOpenDot,
311    #[serde(rename = "triangle-ne")]
312    TriangleNE,
313    #[serde(rename = "triangle-ne-open")]
314    TriangleNEOpen,
315    #[serde(rename = "triangle-ne-dot")]
316    TriangleNEDot,
317    #[serde(rename = "triangle-ne-open-dot")]
318    TriangleNEOpenDot,
319    #[serde(rename = "triangle-se")]
320    TriangleSE,
321    #[serde(rename = "triangle-se-open")]
322    TriangleSEOpen,
323    #[serde(rename = "triangle-se-dot")]
324    TriangleSEDot,
325    #[serde(rename = "triangle-se-open-dot")]
326    TriangleSEOpenDot,
327    #[serde(rename = "triangle-sw")]
328    TriangleSW,
329    #[serde(rename = "triangle-sw-open")]
330    TriangleSWOpen,
331    #[serde(rename = "triangle-sw-dot")]
332    TriangleSWDot,
333    #[serde(rename = "triangle-sw-open-dot")]
334    TriangleSWOpenDot,
335    #[serde(rename = "triangle-nw")]
336    TriangleNW,
337    #[serde(rename = "triangle-nw-open")]
338    TriangleNWOpen,
339    #[serde(rename = "triangle-nw-dot")]
340    TriangleNWDot,
341    #[serde(rename = "triangle-nw-open-dot")]
342    TriangleNWOpenDot,
343    #[serde(rename = "pentagon")]
344    Pentagon,
345    #[serde(rename = "pentagon-open")]
346    PentagonOpen,
347    #[serde(rename = "pentagon-dot")]
348    PentagonDot,
349    #[serde(rename = "pentagon-open-dot")]
350    PentagonOpenDot,
351    #[serde(rename = "hexagon")]
352    Hexagon,
353    #[serde(rename = "hexagon-open")]
354    HexagonOpen,
355    #[serde(rename = "hexagon-dot")]
356    HexagonDot,
357    #[serde(rename = "hexagon-open-dot")]
358    HexagonOpenDot,
359    #[serde(rename = "hexagon2")]
360    Hexagon2,
361    #[serde(rename = "hexagon2-open")]
362    Hexagon2Open,
363    #[serde(rename = "hexagon2-dot")]
364    Hexagon2Dot,
365    #[serde(rename = "hexagon2-open-dot")]
366    Hexagon2OpenDot,
367    #[serde(rename = "octagon")]
368    Octagon,
369    #[serde(rename = "octagon-open")]
370    OctagonOpen,
371    #[serde(rename = "octagon-dot")]
372    OctagonDot,
373    #[serde(rename = "octagon-open-dot")]
374    OctagonOpenDot,
375    #[serde(rename = "star")]
376    Star,
377    #[serde(rename = "star-open")]
378    StarOpen,
379    #[serde(rename = "star-dot")]
380    StarDot,
381    #[serde(rename = "star-open-dot")]
382    StarOpenDot,
383    #[serde(rename = "hexagram")]
384    Hexagram,
385    #[serde(rename = "hexagram-open")]
386    HexagramOpen,
387    #[serde(rename = "hexagram-dot")]
388    HexagramDot,
389    #[serde(rename = "hexagram-open-dot")]
390    HexagramOpenDot,
391    #[serde(rename = "star-triangle-up")]
392    StarTriangleUp,
393    #[serde(rename = "star-triangle-up-open")]
394    StarTriangleUpOpen,
395    #[serde(rename = "star-triangle-up-dot")]
396    StarTriangleUpDot,
397    #[serde(rename = "star-triangle-up-open-dot")]
398    StarTriangleUpOpenDot,
399    #[serde(rename = "star-triangle-down")]
400    StarTriangleDown,
401    #[serde(rename = "star-triangle-down-open")]
402    StarTriangleDownOpen,
403    #[serde(rename = "star-triangle-down-dot")]
404    StarTriangleDownDot,
405    #[serde(rename = "star-triangle-down-open-dot")]
406    StarTriangleDownOpenDot,
407    #[serde(rename = "star-square")]
408    StarSquare,
409    #[serde(rename = "star-square-open")]
410    StarSquareOpen,
411    #[serde(rename = "star-square-dot")]
412    StarSquareDot,
413    #[serde(rename = "star-square-open-dot")]
414    StarSquareOpenDot,
415    #[serde(rename = "star-diamond")]
416    StarDiamond,
417    #[serde(rename = "star-diamond-open")]
418    StarDiamondOpen,
419    #[serde(rename = "star-diamond-dot")]
420    StarDiamondDot,
421    #[serde(rename = "star-diamond-open-dot")]
422    StarDiamondOpenDot,
423    #[serde(rename = "diamond-tall")]
424    DiamondTall,
425    #[serde(rename = "diamond-tall-open")]
426    DiamondTallOpen,
427    #[serde(rename = "diamond-tall-dot")]
428    DiamondTallDot,
429    #[serde(rename = "diamond-tall-open-dot")]
430    DiamondTallOpenDot,
431    #[serde(rename = "diamond-wide")]
432    DiamondWide,
433    #[serde(rename = "diamond-wide-open")]
434    DiamondWideOpen,
435    #[serde(rename = "diamond-wide-dot")]
436    DiamondWideDot,
437    #[serde(rename = "diamond-wide-open-dot")]
438    DiamondWideOpenDot,
439    #[serde(rename = "hourglass")]
440    Hourglass,
441    #[serde(rename = "hourglass-open")]
442    HourglassOpen,
443    #[serde(rename = "bowtie")]
444    BowTie,
445    #[serde(rename = "bowtie-open")]
446    BowTieOpen,
447    #[serde(rename = "circle-cross")]
448    CircleCross,
449    #[serde(rename = "circle-cross-open")]
450    CircleCrossOpen,
451    #[serde(rename = "circle-x")]
452    CircleX,
453    #[serde(rename = "circle-x-open")]
454    CircleXOpen,
455    #[serde(rename = "square-cross")]
456    SquareCross,
457    #[serde(rename = "square-cross-open")]
458    SquareCrossOpen,
459    #[serde(rename = "square-x")]
460    SquareX,
461    #[serde(rename = "square-x-open")]
462    SquareXOpen,
463    #[serde(rename = "diamond-cross")]
464    DiamondCross,
465    #[serde(rename = "diamond-cross-open")]
466    DiamondCrossOpen,
467    #[serde(rename = "diamond-x")]
468    DiamondX,
469    #[serde(rename = "diamond-x-open")]
470    DiamondXOpen,
471    #[serde(rename = "cross-thin")]
472    CrossThin,
473    #[serde(rename = "cross-thin-open")]
474    CrossThinOpen,
475    #[serde(rename = "x-thin")]
476    XThin,
477    #[serde(rename = "x-thin-open")]
478    XThinOpen,
479    #[serde(rename = "asterisk")]
480    Asterisk,
481    #[serde(rename = "asterisk-open")]
482    AsteriskOpen,
483    #[serde(rename = "hash")]
484    Hash,
485    #[serde(rename = "hash-open")]
486    HashOpen,
487    #[serde(rename = "hash-dot")]
488    HashDot,
489    #[serde(rename = "hash-open-dot")]
490    HashOpenDot,
491    #[serde(rename = "y-up")]
492    YUp,
493    #[serde(rename = "y-up-open")]
494    YUpOpen,
495    #[serde(rename = "y-down")]
496    YDown,
497    #[serde(rename = "y-down-open")]
498    YDownOpen,
499    #[serde(rename = "y-left")]
500    YLeft,
501    #[serde(rename = "y-left-open")]
502    YLeftOpen,
503    #[serde(rename = "y-right")]
504    YRight,
505    #[serde(rename = "y-right-open")]
506    YRightOpen,
507    #[serde(rename = "line-ew")]
508    LineEW,
509    #[serde(rename = "line-ew-open")]
510    LineEWOpen,
511    #[serde(rename = "line-ns")]
512    LineNS,
513    #[serde(rename = "line-ns-open")]
514    LineNSOpen,
515    #[serde(rename = "line-ne")]
516    LineNE,
517    #[serde(rename = "line-ne-open")]
518    LineNEOpen,
519    #[serde(rename = "line-nw")]
520    LineNW,
521    #[serde(rename = "line-nw-open")]
522    LineNWOpen,
523}
524
525#[derive(Serialize, Clone, Debug)]
526pub enum TickMode {
527    #[serde(rename = "auto")]
528    Auto,
529    #[serde(rename = "linear")]
530    Linear,
531    #[serde(rename = "array")]
532    Array,
533}
534
535#[derive(Serialize, Clone, Debug)]
536pub enum DashType {
537    #[serde(rename = "solid")]
538    Solid,
539    #[serde(rename = "dot")]
540    Dot,
541    #[serde(rename = "dash")]
542    Dash,
543    #[serde(rename = "longdashdot")]
544    LongDash,
545    #[serde(rename = "dashdot")]
546    DashDot,
547    #[serde(rename = "longdashdot")]
548    LongDashDot,
549}
550
551#[derive(Serialize, Clone, Debug)]
552pub struct ColorScaleElement(f64, String);
553
554#[derive(Serialize, Clone, Debug)]
555pub enum ColorScalePalette {
556    Greys,
557    YlGnBu,
558    Greens,
559    YlOrRd,
560    Bluered,
561    RdBu,
562    Reds,
563    Blues,
564    Picnic,
565    Rainbow,
566    Portland,
567    Jet,
568    Hot,
569    Blackbody,
570    Earth,
571    Electric,
572    Viridis,
573    Cividis,
574}
575
576#[derive(Serialize, Clone, Debug)]
577#[serde(untagged)]
578pub enum ColorScale {
579    Palette(ColorScalePalette),
580    Vector(Vec<ColorScaleElement>),
581}
582
583#[derive(Serialize, Clone, Debug)]
584pub enum LineShape {
585    #[serde(rename = "linear")]
586    Linear,
587    #[serde(rename = "spline")]
588    Spline,
589    #[serde(rename = "hv")]
590    Hv,
591    #[serde(rename = "vh")]
592    Vh,
593    #[serde(rename = "hvh")]
594    Hvh,
595    #[serde(rename = "vhv")]
596    Vhv,
597}
598
599#[derive(Serialize, Clone, Debug, Default)]
600pub struct Line {
601    #[serde(skip_serializing_if = "Option::is_none")]
602    width: Option<f64>,
603    #[serde(skip_serializing_if = "Option::is_none")]
604    shape: Option<LineShape>,
605    #[serde(skip_serializing_if = "Option::is_none")]
606    smoothing: Option<f64>,
607    #[serde(skip_serializing_if = "Option::is_none")]
608    dash: Option<DashType>,
609    #[serde(skip_serializing_if = "Option::is_none")]
610    simplify: Option<bool>,
611    #[serde(skip_serializing_if = "Option::is_none")]
612    color: Option<ColorWrapper>,
613    #[serde(skip_serializing_if = "Option::is_none")]
614    cauto: Option<bool>,
615    #[serde(skip_serializing_if = "Option::is_none")]
616    cmin: Option<f64>,
617    #[serde(skip_serializing_if = "Option::is_none")]
618    cmax: Option<f64>,
619    #[serde(skip_serializing_if = "Option::is_none")]
620    cmid: Option<f64>,
621    #[serde(skip_serializing_if = "Option::is_none", rename = "colorscale")]
622    color_scale: Option<ColorScale>,
623    #[serde(skip_serializing_if = "Option::is_none", rename = "autocolorscale")]
624    auto_color_scale: Option<bool>,
625    #[serde(skip_serializing_if = "Option::is_none", rename = "reversescale")]
626    reverse_scale: Option<bool>,
627    #[serde(skip_serializing_if = "Option::is_none", rename = "outliercolor")]
628    outlier_color: Option<ColorWrapper>,
629    #[serde(skip_serializing_if = "Option::is_none", rename = "outlierwidth")]
630    outlier_width: Option<usize>,
631}
632
633impl Line {
634    pub fn new() -> Line {
635        Default::default()
636    }
637
638    pub fn width(mut self, width: f64) -> Line {
639        self.width = Some(width);
640        self
641    }
642
643    pub fn shape(mut self, shape: LineShape) -> Line {
644        self.shape = Some(shape);
645        self
646    }
647
648    pub fn smoothing(mut self, smoothing: f64) -> Line {
649        self.smoothing = Some(smoothing);
650        self
651    }
652
653    pub fn dash(mut self, dash: DashType) -> Line {
654        self.dash = Some(dash);
655        self
656    }
657
658    pub fn simplify(mut self, simplify: bool) -> Line {
659        self.simplify = Some(simplify);
660        self
661    }
662
663    pub fn color<C: Color>(mut self, color: C) -> Line {
664        self.color = Some(color.to_color());
665        self
666    }
667
668    pub fn cauto(mut self, cauto: bool) -> Line {
669        self.cauto = Some(cauto);
670        self
671    }
672
673    pub fn cmin(mut self, cmin: f64) -> Line {
674        self.cmin = Some(cmin);
675        self
676    }
677
678    pub fn cmax(mut self, cmax: f64) -> Line {
679        self.cmax = Some(cmax);
680        self
681    }
682
683    pub fn cmid(mut self, cmid: f64) -> Line {
684        self.cmid = Some(cmid);
685        self
686    }
687
688    pub fn color_scale(mut self, color_scale: ColorScale) -> Line {
689        self.color_scale = Some(color_scale);
690        self
691    }
692
693    pub fn auto_color_scale(mut self, auto_color_scale: bool) -> Line {
694        self.auto_color_scale = Some(auto_color_scale);
695        self
696    }
697
698    pub fn reverse_scale(mut self, reverse_scale: bool) -> Line {
699        self.reverse_scale = Some(reverse_scale);
700        self
701    }
702
703    pub fn outlier_color<C: Color>(mut self, outlier_color: C) -> Line {
704        self.outlier_color = Some(outlier_color.to_color());
705        self
706    }
707
708    pub fn outlier_width(mut self, outlier_width: usize) -> Line {
709        self.outlier_width = Some(outlier_width);
710        self
711    }
712}
713
714#[derive(Serialize, Clone, Debug)]
715pub enum GradientType {
716    #[serde(rename = "radial")]
717    Radial,
718    #[serde(rename = "horizontal")]
719    Horizontal,
720    #[serde(rename = "vertical")]
721    Vertical,
722    #[serde(rename = "none")]
723    None,
724}
725
726#[derive(Serialize, Clone, Debug)]
727pub enum SizeMode {
728    #[serde(rename = "diameter")]
729    Diameter,
730    #[serde(rename = "area")]
731    Area,
732}
733
734#[derive(Serialize, Clone, Debug)]
735pub enum ThicknessMode {
736    #[serde(rename = "fraction")]
737    Fraction,
738    #[serde(rename = "pixels")]
739    Pixels,
740}
741
742#[derive(Serialize, Clone, Debug)]
743pub enum Anchor {
744    #[serde(rename = "auto")]
745    Auto,
746    #[serde(rename = "left")]
747    Left,
748    #[serde(rename = "center")]
749    Center,
750    #[serde(rename = "right")]
751    Right,
752    #[serde(rename = "top")]
753    Top,
754    #[serde(rename = "middle")]
755    Middle,
756    #[serde(rename = "bottom")]
757    Bottom,
758}
759
760#[derive(Serialize, Clone, Debug)]
761pub enum TextAnchor {
762    #[serde(rename = "start")]
763    Start,
764    #[serde(rename = "middle")]
765    Middle,
766    #[serde(rename = "end")]
767    End,
768}
769
770#[derive(Serialize, Clone, Debug)]
771pub enum ExponentFormat {
772    #[serde(rename = "none")]
773    None,
774    #[serde(rename = "e")]
775    SmallE,
776    #[serde(rename = "E")]
777    CapitalE,
778    #[serde(rename = "power")]
779    Power,
780    #[serde(rename = "SI")]
781    SI,
782    #[serde(rename = "B")]
783    B,
784}
785
786#[derive(Serialize, Clone, Debug)]
787pub struct Gradient {
788    r#type: GradientType,
789    color: Dim<ColorWrapper>,
790}
791
792impl Gradient {
793    pub fn new<C: Color + Serialize>(gradient_type: GradientType, color: Dim<C>) -> Gradient {
794        let color = match color {
795            Dim::Scalar(c) => Dim::Scalar(c.to_color()),
796            Dim::Vector(c) => Dim::Vector(private::to_color_array(c)),
797        };
798        Gradient {
799            r#type: gradient_type,
800            color,
801        }
802    }
803}
804
805#[derive(Serialize, Clone, Debug, Default)]
806pub struct TickFormatStop {
807    enabled: bool,
808    #[serde(skip_serializing_if = "Option::is_none", rename = "dtickrange")]
809    dtick_range: Option<Vec<NumOrStringWrapper>>,
810    #[serde(skip_serializing_if = "Option::is_none")]
811    value: Option<String>,
812    #[serde(skip_serializing_if = "Option::is_none")]
813    name: Option<String>,
814    #[serde(skip_serializing_if = "Option::is_none", rename = "templateitemname")]
815    template_item_name: Option<String>,
816}
817
818impl TickFormatStop {
819    pub fn new() -> TickFormatStop {
820        TickFormatStop {
821            enabled: true,
822            ..Default::default()
823        }
824    }
825
826    pub fn enabled(mut self, enabled: bool) -> TickFormatStop {
827        self.enabled = enabled;
828        self
829    }
830
831    pub fn dtick_range<C: NumOrString>(mut self, range: Vec<C>) -> TickFormatStop {
832        let wrapped = to_num_or_string_wrapper(range);
833        self.dtick_range = Some(wrapped);
834        self
835    }
836
837    pub fn value(mut self, value: &str) -> TickFormatStop {
838        self.value = Some(value.to_owned());
839        self
840    }
841
842    pub fn name(mut self, name: &str) -> TickFormatStop {
843        self.name = Some(name.to_owned());
844        self
845    }
846
847    pub fn template_item_name(mut self, name: &str) -> TickFormatStop {
848        self.template_item_name = Some(name.to_owned());
849        self
850    }
851}
852
853#[derive(Serialize, Clone, Debug)]
854pub struct ColorBar {
855    #[serde(skip_serializing_if = "Option::is_none", rename = "thicknessmode")]
856    thickness_mode: Option<ThicknessMode>,
857    thickness: usize,
858    #[serde(skip_serializing_if = "Option::is_none", rename = "lenmode")]
859    len_mode: Option<ThicknessMode>,
860    len: usize,
861    x: f64,
862    #[serde(rename = "xanchor")]
863    x_anchor: Anchor,
864    #[serde(rename = "xpad")]
865    x_pad: f64,
866    y: f64,
867    #[serde(rename = "yanchor")]
868    y_anchor: Anchor,
869    #[serde(rename = "ypad")]
870    y_pad: f64,
871    #[serde(skip_serializing_if = "Option::is_none", rename = "outlinecolor")]
872    outline_color: Option<ColorWrapper>,
873    #[serde(rename = "outlinewidth")]
874    outline_width: usize,
875    #[serde(skip_serializing_if = "Option::is_none", rename = "bordercolor")]
876    border_color: Option<ColorWrapper>,
877    #[serde(rename = "borderwidth")]
878    border_width: usize,
879    #[serde(skip_serializing_if = "Option::is_none", rename = "bgcolor")]
880    background_color: Option<ColorWrapper>,
881    #[serde(skip_serializing_if = "Option::is_none", rename = "tickmode")]
882    tick_mode: Option<TickMode>,
883    #[serde(rename = "nticks")]
884    n_ticks: usize,
885    #[serde(skip_serializing_if = "Option::is_none")]
886    tick0: Option<f64>,
887    #[serde(skip_serializing_if = "Option::is_none")]
888    dtick: Option<f64>,
889    #[serde(skip_serializing_if = "Option::is_none", rename = "tickvals")]
890    tick_vals: Option<Vec<f64>>,
891    #[serde(skip_serializing_if = "Option::is_none", rename = "ticktext")]
892    tick_text: Option<Vec<String>>,
893    #[serde(skip_serializing_if = "Option::is_none")]
894    ticks: Option<String>,
895    #[serde(rename = "ticklen")]
896    tick_len: usize,
897    #[serde(rename = "tickwidth")]
898    tick_width: usize,
899    #[serde(skip_serializing_if = "Option::is_none", rename = "tickcolor")]
900    tick_color: Option<ColorWrapper>,
901    #[serde(rename = "showticklabels")]
902    show_tick_labels: bool,
903    #[serde(skip_serializing_if = "Option::is_none", rename = "tickfont")]
904    tick_font: Option<Font>,
905    #[serde(skip_serializing_if = "Option::is_none", rename = "tickangle")]
906    tick_angle: Option<f64>,
907    #[serde(skip_serializing_if = "Option::is_none", rename = "tickformat")]
908    tick_format: Option<String>,
909    #[serde(skip_serializing_if = "Option::is_none", rename = "tickformatstops")]
910    tick_format_stops: Option<Vec<TickFormatStop>>,
911    #[serde(skip_serializing_if = "Option::is_none", rename = "tickprefix")]
912    tick_prefix: Option<String>,
913    #[serde(skip_serializing_if = "Option::is_none", rename = "showtickprefix")]
914    show_tick_prefix: Option<String>,
915    #[serde(skip_serializing_if = "Option::is_none", rename = "ticksuffix")]
916    tick_suffix: Option<String>,
917    #[serde(skip_serializing_if = "Option::is_none", rename = "showticksuffix")]
918    show_tick_suffix: Option<String>,
919    separate_thousands: bool,
920    #[serde(skip_serializing_if = "Option::is_none", rename = "exponentformat")]
921    exponent_format: Option<ExponentFormat>,
922    #[serde(skip_serializing_if = "Option::is_none", rename = "showexponent")]
923    show_exponent: Option<String>,
924    #[serde(skip_serializing_if = "Option::is_none")]
925    title: Option<Title>,
926}
927
928impl Default for ColorBar {
929    fn default() -> Self {
930        Self::new()
931    }
932}
933
934impl ColorBar {
935    pub fn new() -> ColorBar {
936        ColorBar {
937            thickness: 30,
938            len: 1,
939            x: 1.02,
940            x_anchor: Anchor::Left,
941            x_pad: 10.0,
942            y: 0.5,
943            y_anchor: Anchor::Middle,
944            y_pad: 10.0,
945            outline_width: 1,
946            border_width: 0,
947            n_ticks: 0,
948            tick_len: 5,
949            tick_width: 1,
950            show_tick_labels: true,
951            separate_thousands: true,
952            ..Default::default()
953        }
954    }
955
956    pub fn thickness_mode(mut self, thickness_mode: ThicknessMode) -> ColorBar {
957        self.thickness_mode = Some(thickness_mode);
958        self
959    }
960
961    pub fn thickness(mut self, thickness: usize) -> ColorBar {
962        self.thickness = thickness;
963        self
964    }
965
966    pub fn len_mode(mut self, len_mode: ThicknessMode) -> ColorBar {
967        self.len_mode = Some(len_mode);
968        self
969    }
970
971    pub fn len(mut self, len: usize) -> ColorBar {
972        self.len = len;
973        self
974    }
975
976    pub fn x(mut self, x: f64) -> ColorBar {
977        self.x = x;
978        self
979    }
980
981    pub fn x_anchor(mut self, x_anchor: Anchor) -> ColorBar {
982        self.x_anchor = x_anchor;
983        self
984    }
985
986    pub fn x_pad(mut self, x_pad: f64) -> ColorBar {
987        self.x_pad = x_pad;
988        self
989    }
990
991    pub fn y(mut self, y: f64) -> ColorBar {
992        self.y = y;
993        self
994    }
995
996    pub fn y_anchor(mut self, y_anchor: Anchor) -> ColorBar {
997        self.y_anchor = y_anchor;
998        self
999    }
1000
1001    pub fn y_pad(mut self, y_pad: f64) -> ColorBar {
1002        self.y_pad = y_pad;
1003        self
1004    }
1005
1006    pub fn outline_color<C: Color>(mut self, outline_color: C) -> ColorBar {
1007        self.outline_color = Some(outline_color.to_color());
1008        self
1009    }
1010
1011    pub fn outline_width(mut self, outline_width: usize) -> ColorBar {
1012        self.outline_width = outline_width;
1013        self
1014    }
1015
1016    pub fn border_color<C: Color>(mut self, border_color: C) -> ColorBar {
1017        self.border_color = Some(border_color.to_color());
1018        self
1019    }
1020
1021    pub fn border_width(mut self, border_width: usize) -> ColorBar {
1022        self.border_width = border_width;
1023        self
1024    }
1025
1026    pub fn background_color<C: Color>(mut self, background_color: C) -> ColorBar {
1027        self.background_color = Some(background_color.to_color());
1028        self
1029    }
1030
1031    pub fn tick_mode(mut self, tick_mode: TickMode) -> ColorBar {
1032        self.tick_mode = Some(tick_mode);
1033        self
1034    }
1035
1036    pub fn n_ticks(mut self, n_ticks: usize) -> ColorBar {
1037        self.n_ticks = n_ticks;
1038        self
1039    }
1040
1041    pub fn tick0(mut self, tick0: f64) -> ColorBar {
1042        self.tick0 = Some(tick0);
1043        self
1044    }
1045
1046    pub fn dtick(mut self, dtick: f64) -> ColorBar {
1047        self.dtick = Some(dtick);
1048        self
1049    }
1050
1051    pub fn tick_vals(mut self, tick_vals: Vec<f64>) -> ColorBar {
1052        self.tick_vals = Some(tick_vals);
1053        self
1054    }
1055
1056    pub fn tick_text(mut self, tick_text: Vec<String>) -> ColorBar {
1057        self.tick_text = Some(tick_text);
1058        self
1059    }
1060
1061    pub fn ticks(mut self, ticks: &str) -> ColorBar {
1062        self.ticks = Some(ticks.to_owned());
1063        self
1064    }
1065
1066    pub fn tick_len(mut self, tick_len: usize) -> ColorBar {
1067        self.tick_len = tick_len;
1068        self
1069    }
1070
1071    pub fn tick_width(mut self, tick_width: usize) -> ColorBar {
1072        self.tick_width = tick_width;
1073        self
1074    }
1075
1076    pub fn tick_color<C: Color>(mut self, tick_color: C) -> ColorBar {
1077        self.tick_color = Some(tick_color.to_color());
1078        self
1079    }
1080
1081    pub fn show_tick_labels(mut self, show_tick_labels: bool) -> ColorBar {
1082        self.show_tick_labels = show_tick_labels;
1083        self
1084    }
1085
1086    pub fn tick_font(mut self, tick_font: Font) -> ColorBar {
1087        self.tick_font = Some(tick_font);
1088        self
1089    }
1090
1091    pub fn tick_angle(mut self, tick_angle: f64) -> ColorBar {
1092        self.tick_angle = Some(tick_angle);
1093        self
1094    }
1095
1096    pub fn tick_format(mut self, tick_format: &str) -> ColorBar {
1097        self.tick_format = Some(tick_format.to_owned());
1098        self
1099    }
1100
1101    pub fn tick_format_stops(mut self, tick_format_stops: Vec<TickFormatStop>) -> ColorBar {
1102        self.tick_format_stops = Some(tick_format_stops);
1103        self
1104    }
1105
1106    pub fn tick_prefix(mut self, tick_prefix: &str) -> ColorBar {
1107        self.tick_prefix = Some(tick_prefix.to_owned());
1108        self
1109    }
1110
1111    pub fn show_tick_prefix(mut self, show_tick_prefix: &str) -> ColorBar {
1112        self.show_tick_prefix = Some(show_tick_prefix.to_owned());
1113        self
1114    }
1115
1116    pub fn tick_suffix(mut self, tick_suffix: &str) -> ColorBar {
1117        self.tick_suffix = Some(tick_suffix.to_owned());
1118        self
1119    }
1120
1121    pub fn show_tick_suffix(mut self, show_tick_suffix: &str) -> ColorBar {
1122        self.show_tick_suffix = Some(show_tick_suffix.to_owned());
1123        self
1124    }
1125
1126    pub fn separate_thousands(mut self, separate_thousands: bool) -> ColorBar {
1127        self.separate_thousands = separate_thousands;
1128        self
1129    }
1130
1131    pub fn exponent_format(mut self, exponent_format: ExponentFormat) -> ColorBar {
1132        self.exponent_format = Some(exponent_format);
1133        self
1134    }
1135
1136    pub fn show_exponent(mut self, show_exponent: &str) -> ColorBar {
1137        self.show_exponent = Some(show_exponent.to_owned());
1138        self
1139    }
1140
1141    pub fn title(mut self, title: Title) -> ColorBar {
1142        self.title = Some(title);
1143        self
1144    }
1145}
1146
1147#[derive(Serialize, Clone, Debug, Default)]
1148pub struct Marker {
1149    #[serde(skip_serializing_if = "Option::is_none")]
1150    symbol: Option<MarkerSymbol>,
1151    #[serde(skip_serializing_if = "Option::is_none")]
1152    opacity: Option<f64>,
1153    #[serde(skip_serializing_if = "Option::is_none")]
1154    size: Option<Dim<usize>>,
1155    #[serde(skip_serializing_if = "Option::is_none", rename = "maxdisplayed")]
1156    max_displayed: Option<usize>,
1157    #[serde(skip_serializing_if = "Option::is_none", rename = "sizeref")]
1158    size_ref: Option<usize>,
1159    #[serde(skip_serializing_if = "Option::is_none", rename = "sizemin")]
1160    size_min: Option<usize>,
1161    #[serde(skip_serializing_if = "Option::is_none", rename = "sizemin")]
1162    size_mode: Option<SizeMode>,
1163    #[serde(skip_serializing_if = "Option::is_none")]
1164    line: Option<Line>,
1165    #[serde(skip_serializing_if = "Option::is_none")]
1166    gradient: Option<Gradient>,
1167    #[serde(skip_serializing_if = "Option::is_none")]
1168    color: Option<Dim<ColorWrapper>>,
1169    #[serde(skip_serializing_if = "Option::is_none")]
1170    cauto: Option<bool>,
1171    #[serde(skip_serializing_if = "Option::is_none")]
1172    cmin: Option<f64>,
1173    #[serde(skip_serializing_if = "Option::is_none")]
1174    cmax: Option<f64>,
1175    #[serde(skip_serializing_if = "Option::is_none")]
1176    cmid: Option<f64>,
1177    #[serde(skip_serializing_if = "Option::is_none", rename = "colorscale")]
1178    color_scale: Option<ColorScale>,
1179    #[serde(skip_serializing_if = "Option::is_none", rename = "autocolorscale")]
1180    auto_color_scale: Option<bool>,
1181    #[serde(skip_serializing_if = "Option::is_none", rename = "reversescale")]
1182    reverse_scale: Option<bool>,
1183    #[serde(skip_serializing_if = "Option::is_none", rename = "showscale")]
1184    show_scale: Option<bool>,
1185    #[serde(skip_serializing_if = "Option::is_none", rename = "colorbar")]
1186    color_bar: Option<ColorBar>,
1187    #[serde(skip_serializing_if = "Option::is_none", rename = "outliercolor")]
1188    outlier_color: Option<ColorWrapper>,
1189}
1190
1191impl Marker {
1192    pub fn new() -> Marker {
1193        Default::default()
1194    }
1195
1196    pub fn symbol(mut self, symbol: MarkerSymbol) -> Marker {
1197        self.symbol = Some(symbol);
1198        self
1199    }
1200
1201    pub fn opacity(mut self, opacity: f64) -> Marker {
1202        self.opacity = Some(opacity);
1203        self
1204    }
1205
1206    pub fn size(mut self, size: usize) -> Marker {
1207        self.size = Some(Dim::Scalar(size));
1208        self
1209    }
1210
1211    pub fn size_array(mut self, size: Vec<usize>) -> Marker {
1212        self.size = Some(Dim::Vector(size));
1213        self
1214    }
1215
1216    pub fn max_displayed(mut self, size: usize) -> Marker {
1217        self.max_displayed = Some(size);
1218        self
1219    }
1220
1221    pub fn size_ref(mut self, size: usize) -> Marker {
1222        self.size_ref = Some(size);
1223        self
1224    }
1225
1226    pub fn size_min(mut self, size: usize) -> Marker {
1227        self.size_min = Some(size);
1228        self
1229    }
1230
1231    pub fn size_mode(mut self, mode: SizeMode) -> Marker {
1232        self.size_mode = Some(mode);
1233        self
1234    }
1235
1236    pub fn line(mut self, line: Line) -> Marker {
1237        self.line = Some(line);
1238        self
1239    }
1240
1241    pub fn gradient(mut self, gradient: Gradient) -> Marker {
1242        self.gradient = Some(gradient);
1243        self
1244    }
1245
1246    pub fn color<C: Color>(mut self, color: C) -> Marker {
1247        self.color = Some(Dim::Scalar(color.to_color()));
1248        self
1249    }
1250
1251    pub fn color_array<C: Color>(mut self, color: Vec<C>) -> Marker {
1252        let color = private::to_color_array(color);
1253        self.color = Some(Dim::Vector(color));
1254        self
1255    }
1256
1257    pub fn cauto(mut self, cauto: bool) -> Marker {
1258        self.cauto = Some(cauto);
1259        self
1260    }
1261
1262    pub fn cmin(mut self, cmin: f64) -> Marker {
1263        self.cmin = Some(cmin);
1264        self
1265    }
1266
1267    pub fn cmax(mut self, cmax: f64) -> Marker {
1268        self.cmax = Some(cmax);
1269        self
1270    }
1271
1272    pub fn cmid(mut self, cmid: f64) -> Marker {
1273        self.cmid = Some(cmid);
1274        self
1275    }
1276
1277    pub fn color_scale(mut self, color_scale: ColorScale) -> Marker {
1278        self.color_scale = Some(color_scale);
1279        self
1280    }
1281
1282    pub fn auto_color_scale(mut self, auto_color_scale: bool) -> Marker {
1283        self.auto_color_scale = Some(auto_color_scale);
1284        self
1285    }
1286
1287    pub fn reverse_scale(mut self, reverse_scale: bool) -> Marker {
1288        self.reverse_scale = Some(reverse_scale);
1289        self
1290    }
1291
1292    pub fn show_scale(mut self, show_scale: bool) -> Marker {
1293        self.show_scale = Some(show_scale);
1294        self
1295    }
1296
1297    pub fn color_bar(mut self, colorbar: ColorBar) -> Marker {
1298        self.color_bar = Some(colorbar);
1299        self
1300    }
1301
1302    pub fn outlier_color<C: Color>(mut self, outlier_color: C) -> Marker {
1303        self.outlier_color = Some(outlier_color.to_color());
1304        self
1305    }
1306}
1307
1308#[derive(Serialize, Clone, Debug, Default)]
1309pub struct Font {
1310    #[serde(skip_serializing_if = "Option::is_none")]
1311    family: Option<String>,
1312    #[serde(skip_serializing_if = "Option::is_none")]
1313    size: Option<usize>,
1314    #[serde(skip_serializing_if = "Option::is_none")]
1315    color: Option<ColorWrapper>,
1316}
1317
1318impl Font {
1319    pub fn new() -> Font {
1320        Default::default()
1321    }
1322
1323    pub fn family(mut self, family: &str) -> Font {
1324        self.family = Some(family.to_owned());
1325        self
1326    }
1327
1328    pub fn size(mut self, size: usize) -> Font {
1329        self.size = Some(size);
1330        self
1331    }
1332
1333    pub fn color<C: Color>(mut self, color: C) -> Font {
1334        self.color = Some(color.to_color());
1335        self
1336    }
1337}
1338
1339#[derive(Serialize, Clone, Debug)]
1340pub enum Side {
1341    #[serde(rename = "right")]
1342    Right,
1343    #[serde(rename = "top")]
1344    Top,
1345    #[serde(rename = "bottom")]
1346    Bottom,
1347    #[serde(rename = "left")]
1348    Left,
1349    #[serde(rename = "top left")]
1350    TopLeft,
1351}
1352
1353#[derive(Serialize, Clone, Debug)]
1354pub enum Reference {
1355    #[serde(rename = "container")]
1356    Container,
1357    #[serde(rename = "paper")]
1358    Paper,
1359}
1360
1361#[derive(Serialize, Clone, Debug)]
1362pub struct Pad {
1363    t: usize,
1364    b: usize,
1365    l: usize,
1366}
1367
1368impl Pad {
1369    pub fn new(t: usize, b: usize, l: usize) -> Pad {
1370        Pad { t, b, l }
1371    }
1372}
1373
1374#[derive(Serialize, Clone, Debug, Default)]
1375pub struct Title {
1376    text: String,
1377    #[serde(skip_serializing_if = "Option::is_none")]
1378    font: Option<Font>,
1379    #[serde(skip_serializing_if = "Option::is_none")]
1380    side: Option<Side>,
1381    #[serde(skip_serializing_if = "Option::is_none", rename = "xref")]
1382    x_ref: Option<Reference>,
1383    #[serde(skip_serializing_if = "Option::is_none", rename = "yref")]
1384    y_ref: Option<Reference>,
1385    #[serde(skip_serializing_if = "Option::is_none")]
1386    x: Option<f64>,
1387    #[serde(skip_serializing_if = "Option::is_none")]
1388    y: Option<f64>,
1389    #[serde(skip_serializing_if = "Option::is_none", rename = "xanchor")]
1390    x_anchor: Option<Anchor>,
1391    #[serde(skip_serializing_if = "Option::is_none", rename = "yanchor")]
1392    y_anchor: Option<Anchor>,
1393    #[serde(skip_serializing_if = "Option::is_none")]
1394    pad: Option<Pad>,
1395}
1396
1397impl From<&str> for Title {
1398    fn from(title: &str) -> Self {
1399        Title::new(title)
1400    }
1401}
1402
1403impl Title {
1404    pub fn new(text: &str) -> Title {
1405        Title {
1406            text: text.to_owned(),
1407            ..Default::default()
1408        }
1409    }
1410
1411    pub fn font(mut self, font: Font) -> Title {
1412        self.font = Some(font);
1413        self
1414    }
1415
1416    pub fn side(mut self, side: Side) -> Title {
1417        self.side = Some(side);
1418        self
1419    }
1420
1421    pub fn x_ref(mut self, xref: Reference) -> Title {
1422        self.x_ref = Some(xref);
1423        self
1424    }
1425
1426    pub fn y_ref(mut self, yref: Reference) -> Title {
1427        self.y_ref = Some(yref);
1428        self
1429    }
1430
1431    pub fn x(mut self, x: f64) -> Title {
1432        self.x = Some(x);
1433        self
1434    }
1435
1436    pub fn y(mut self, y: f64) -> Title {
1437        self.y = Some(y);
1438        self
1439    }
1440
1441    pub fn x_anchor(mut self, anchor: Anchor) -> Title {
1442        self.x_anchor = Some(anchor);
1443        self
1444    }
1445
1446    pub fn y_anchor(mut self, anchor: Anchor) -> Title {
1447        self.y_anchor = Some(anchor);
1448        self
1449    }
1450
1451    pub fn pad(mut self, pad: Pad) -> Title {
1452        self.pad = Some(pad);
1453        self
1454    }
1455}
1456
1457#[derive(Serialize, Clone, Debug, Default)]
1458pub struct Label {
1459    #[serde(skip_serializing_if = "Option::is_none", rename = "bgcolor")]
1460    background_color: Option<ColorWrapper>,
1461    #[serde(skip_serializing_if = "Option::is_none", rename = "bordercolor")]
1462    border_color: Option<ColorWrapper>,
1463    #[serde(skip_serializing_if = "Option::is_none")]
1464    font: Option<Font>,
1465    #[serde(skip_serializing_if = "Option::is_none")]
1466    align: Option<String>,
1467    #[serde(skip_serializing_if = "Option::is_none", rename = "namelength")]
1468    name_length: Option<Dim<i32>>,
1469}
1470
1471impl Label {
1472    pub fn new() -> Label {
1473        Default::default()
1474    }
1475
1476    pub fn background_color<C: Color>(mut self, background_color: C) -> Label {
1477        self.background_color = Some(background_color.to_color());
1478        self
1479    }
1480
1481    pub fn border_color<C: Color>(mut self, border_color: C) -> Label {
1482        self.border_color = Some(border_color.to_color());
1483        self
1484    }
1485
1486    pub fn font(mut self, font: Font) -> Label {
1487        self.font = Some(font);
1488        self
1489    }
1490
1491    pub fn align(mut self, align: &str) -> Label {
1492        self.align = Some(align.to_owned());
1493        self
1494    }
1495
1496    pub fn name_length(mut self, name_length: i32) -> Label {
1497        self.name_length = Some(Dim::Scalar(name_length));
1498        self
1499    }
1500
1501    pub fn name_length_array(mut self, name_length: Vec<i32>) -> Label {
1502        self.name_length = Some(Dim::Vector(name_length));
1503        self
1504    }
1505}
1506
1507#[derive(Serialize, Clone, Debug)]
1508pub enum ErrorType {
1509    #[serde(rename = "percent")]
1510    Percent,
1511    #[serde(rename = "constant")]
1512    Constant,
1513    #[serde(rename = "sqrt")]
1514    SquareRoot,
1515    #[serde(rename = "data")]
1516    Data,
1517}
1518
1519impl Default for ErrorType {
1520    fn default() -> Self {
1521        ErrorType::Percent
1522    }
1523}
1524
1525#[derive(Serialize, Clone, Debug, Default)]
1526pub struct ErrorData {
1527    r#type: ErrorType,
1528    #[serde(skip_serializing_if = "Option::is_none")]
1529    array: Option<Vec<f64>>,
1530    #[serde(skip_serializing_if = "Option::is_none")]
1531    visible: Option<bool>,
1532    #[serde(skip_serializing_if = "Option::is_none")]
1533    symmetric: Option<bool>,
1534    #[serde(skip_serializing_if = "Option::is_none", rename = "arrayminus")]
1535    array_minus: Option<Vec<f64>>,
1536    #[serde(skip_serializing_if = "Option::is_none")]
1537    value: Option<f64>,
1538    #[serde(skip_serializing_if = "Option::is_none", rename = "valueminus")]
1539    value_minus: Option<f64>,
1540    #[serde(skip_serializing_if = "Option::is_none", rename = "traceref")]
1541    trace_ref: Option<usize>,
1542    #[serde(skip_serializing_if = "Option::is_none", rename = "tracerefminus")]
1543    trace_ref_minus: Option<usize>,
1544    #[serde(skip_serializing_if = "Option::is_none")]
1545    copy_ystyle: Option<bool>,
1546    #[serde(skip_serializing_if = "Option::is_none")]
1547    color: Option<ColorWrapper>,
1548    #[serde(skip_serializing_if = "Option::is_none")]
1549    thickness: Option<f64>,
1550    #[serde(skip_serializing_if = "Option::is_none")]
1551    width: Option<usize>,
1552}
1553
1554impl ErrorData {
1555    pub fn new(error_type: ErrorType) -> ErrorData {
1556        ErrorData {
1557            r#type: error_type,
1558            ..Default::default()
1559        }
1560    }
1561
1562    pub fn array(mut self, array: Vec<f64>) -> ErrorData {
1563        self.array = Some(array);
1564        self
1565    }
1566
1567    pub fn visible(mut self, visible: bool) -> ErrorData {
1568        self.visible = Some(visible);
1569        self
1570    }
1571
1572    pub fn symmetric(mut self, symmetric: bool) -> ErrorData {
1573        self.symmetric = Some(symmetric);
1574        self
1575    }
1576
1577    pub fn array_minus(mut self, array_minus: Vec<f64>) -> ErrorData {
1578        self.array_minus = Some(array_minus);
1579        self
1580    }
1581
1582    pub fn value(mut self, value: f64) -> ErrorData {
1583        self.value = Some(value);
1584        self
1585    }
1586
1587    pub fn value_minus(mut self, value_minus: f64) -> ErrorData {
1588        self.value_minus = Some(value_minus);
1589        self
1590    }
1591
1592    pub fn trace_ref(mut self, trace_ref: usize) -> ErrorData {
1593        self.trace_ref = Some(trace_ref);
1594        self
1595    }
1596
1597    pub fn trace_ref_minus(mut self, trace_ref_minus: usize) -> ErrorData {
1598        self.trace_ref_minus = Some(trace_ref_minus);
1599        self
1600    }
1601
1602    pub fn copy_ystyle(mut self, copy_ystyle: bool) -> ErrorData {
1603        self.copy_ystyle = Some(copy_ystyle);
1604        self
1605    }
1606
1607    pub fn color<C: Color>(mut self, color: C) -> ErrorData {
1608        self.color = Some(color.to_color());
1609        self
1610    }
1611
1612    pub fn thickness(mut self, thickness: f64) -> ErrorData {
1613        self.thickness = Some(thickness);
1614        self
1615    }
1616
1617    pub fn width(mut self, width: usize) -> ErrorData {
1618        self.width = Some(width);
1619        self
1620    }
1621}