use crate::error::Result;
use crate::optimized::convert::standard_dataframe;
use crate::optimized::dataframe::OptimizedDataFrame;
use crate::vis::backward_compat::plotters_ext::{OutputType, PlotKind, PlotSettings};
use crate::DataFrame;
use crate::Series;
use std::path::Path;
impl<T> Series<T>
where
T: Clone + Copy + Into<f64> + std::fmt::Debug,
{
pub fn plot_to<P: AsRef<Path>>(&self, path: P, title: Option<&str>) -> Result<()> {
let mut settings = PlotSettings::default();
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Plot", name);
}
self.plotters_plot(path, settings)
}
pub fn line_plot<P: AsRef<Path>>(&self, path: P, title: Option<&str>) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Line;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Line Plot", name);
}
self.plotters_plot(path, settings)
}
pub fn scatter_plot<P: AsRef<Path>>(&self, path: P, title: Option<&str>) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Scatter;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Scatter Plot", name);
}
self.plotters_plot(path, settings)
}
pub fn bar_plot<P: AsRef<Path>>(&self, path: P, title: Option<&str>) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Bar;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Bar Plot", name);
}
self.plotters_plot(path, settings)
}
pub fn histogram<P: AsRef<Path>>(
&self,
path: P,
bins: Option<usize>,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Histogram;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Histogram", name);
}
self.plotters_histogram(path, bins.unwrap_or(10), settings)
}
pub fn area_plot<P: AsRef<Path>>(&self, path: P, title: Option<&str>) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Area;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Area Plot", name);
}
self.plotters_plot(path, settings)
}
pub fn plot_svg<P: AsRef<Path>>(
&self,
path: P,
plot_kind: PlotKind,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = plot_kind;
settings.output_type = OutputType::SVG;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else if let Some(name) = self.name() {
settings.title = format!("{} Plot", name);
}
self.plotters_plot(path, settings)
}
}
impl DataFrame {
pub fn plot_column<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
pub fn line_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Line;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Line Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
pub fn scatter_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Scatter;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Scatter Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
pub fn bar_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Bar;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Bar Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
pub fn area_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Area;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Area Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
pub fn box_plot<P: AsRef<Path>>(
&self,
value_column: &str,
category_column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::BoxPlot;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} by {}", value_column, category_column);
}
settings.x_label = category_column.to_string();
settings.y_label = value_column.to_string();
self.plotters_boxplot(category_column, value_column, path, settings)
}
pub fn scatter_xy<P: AsRef<Path>>(
&self,
x_column: &str,
y_column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Scatter;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} vs {}", y_column, x_column);
}
settings.x_label = x_column.to_string();
settings.y_label = y_column.to_string();
self.plotters_scatter(x_column, y_column, path, settings)
}
pub fn multi_line_plot<P: AsRef<Path>>(
&self,
columns: &[&str],
path: P,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = PlotKind::Line;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = "Multi Column Plot".to_string();
}
self.plotters_plot_columns(columns, path, settings)
}
pub fn plot_svg<P: AsRef<Path>>(
&self,
column: &str,
path: P,
plot_kind: PlotKind,
title: Option<&str>,
) -> Result<()> {
let mut settings = PlotSettings::default();
settings.plot_kind = plot_kind;
settings.output_type = OutputType::SVG;
if let Some(title_str) = title {
settings.title = title_str.to_string();
} else {
settings.title = format!("{} Plot", column);
}
settings.y_label = column.to_string();
self.plotters_plot_column(column, path, settings)
}
}
impl OptimizedDataFrame {
pub fn plot_column<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.plot_column(column, path, title)
}
pub fn line_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.line_plot(column, path, title)
}
pub fn scatter_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.scatter_plot(column, path, title)
}
pub fn bar_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.bar_plot(column, path, title)
}
pub fn area_plot<P: AsRef<Path>>(
&self,
column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.area_plot(column, path, title)
}
pub fn box_plot<P: AsRef<Path>>(
&self,
value_column: &str,
category_column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.box_plot(value_column, category_column, path, title)
}
pub fn scatter_xy<P: AsRef<Path>>(
&self,
x_column: &str,
y_column: &str,
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.scatter_xy(x_column, y_column, path, title)
}
pub fn multi_line_plot<P: AsRef<Path>>(
&self,
columns: &[&str],
path: P,
title: Option<&str>,
) -> Result<()> {
let df = standard_dataframe(self)?;
df.multi_line_plot(columns, path, title)
}
}