pub struct BarChart<'a> { /* private fields */ }
Expand description
A chart showing values as bars.
Here is a possible BarChart
output.
┌─────────────────────────────────┐
│ ████│
│ ▅▅▅▅ ████│
│ ▇▇▇▇ ████ ████│
│ ▄▄▄▄ ████ ████ ████ ████│
│▆10▆ █20█ █50█ █40█ █60█ █90█│
│ B1 B2 B1 B2 B1 B2 │
│ Group1 Group2 Group3 │
└─────────────────────────────────┘
A BarChart
is composed of a set of Bar
which can be set via BarChart::data
.
Bars can be styled globally (BarChart::bar_style
) or individually (Bar::style
).
There are other methods available to style even more precisely. See Bar
to find out about
each bar component.
The BarChart
widget can also show groups of bars via BarGroup
.
A BarGroup
is a set of Bar
, multiple can be added to a BarChart
using
BarChart::data
multiple time as demonstrated in the example below.
The chart can have a Direction
(by default the bars are Vertical
).
This is set using BarChart::direction
.
Note: this is the only widget that doesn’t implement Widget
for &T
because the current
implementation modifies the internal state of self. This will be fixed in the future.
§Examples
The following example creates a BarChart
with two groups of bars.
The first group is added by an array slice (&[(&str, u64)]
).
The second group is added by a BarGroup
instance.
use ratatui::{
style::{Style, Stylize},
widgets::{Bar, BarChart, BarGroup, Block},
};
BarChart::default()
.block(Block::bordered().title("BarChart"))
.bar_width(3)
.bar_gap(1)
.group_gap(3)
.bar_style(Style::new().yellow().on_red())
.value_style(Style::new().red().bold())
.label_style(Style::new().white())
.data(&[("B0", 0), ("B1", 2), ("B2", 4), ("B3", 3)])
.data(BarGroup::default().bars(&[Bar::default().value(10), Bar::default().value(20)]))
.max(4);
Implementations§
Source§impl<'a> BarChart<'a>
impl<'a> BarChart<'a>
Sourcepub fn data(self, data: impl Into<BarGroup<'a>>) -> Self
pub fn data(self, data: impl Into<BarGroup<'a>>) -> Self
Add group of bars to the BarChart
§Examples
The following example creates a BarChart
with two groups of bars.
The first group is added by an array slice (&[(&str, u64)]
).
The second group is added by a BarGroup
instance.
use ratatui::widgets::{Bar, BarChart, BarGroup};
BarChart::default()
.data(&[("B0", 0), ("B1", 2), ("B2", 4), ("B3", 3)])
.data(BarGroup::default().bars(&[Bar::default().value(10), Bar::default().value(20)]));
Examples found in repository?
83fn vertical_barchart(temperatures: &[u8]) -> BarChart {
84 let bars: Vec<Bar> = temperatures
85 .iter()
86 .enumerate()
87 .map(|(hour, value)| vertical_bar(hour, value))
88 .collect();
89 let title = Line::from("Weather (Vertical)").centered();
90 BarChart::default()
91 .data(BarGroup::default().bars(&bars))
92 .block(Block::new().title(title))
93 .bar_width(5)
94}
95
96fn vertical_bar(hour: usize, temperature: &u8) -> Bar {
97 Bar::default()
98 .value(u64::from(*temperature))
99 .label(Line::from(format!("{hour:>02}:00")))
100 .text_value(format!("{temperature:>3}°"))
101 .style(temperature_style(*temperature))
102 .value_style(temperature_style(*temperature).reversed())
103}
104
105/// Create a horizontal bar chart from the temperatures data.
106fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
107 let bars: Vec<Bar> = temperatures
108 .iter()
109 .enumerate()
110 .map(|(hour, value)| horizontal_bar(hour, value))
111 .collect();
112 let title = Line::from("Weather (Horizontal)").centered();
113 BarChart::default()
114 .block(Block::new().title(title))
115 .data(BarGroup::default().bars(&bars))
116 .bar_width(1)
117 .bar_gap(0)
118 .direction(Direction::Horizontal)
119}
More examples
93 fn vertical_revenue_barchart(&self) -> BarChart<'_> {
94 let mut barchart = BarChart::default()
95 .block(Block::new().title(Line::from("Company revenues (Vertical)").centered()))
96 .bar_gap(0)
97 .bar_width(6)
98 .group_gap(2);
99
100 for group in self
101 .revenues
102 .iter()
103 .map(|revenue| revenue.to_vertical_bar_group(&self.companies))
104 {
105 barchart = barchart.data(group);
106 }
107 barchart
108 }
109
110 /// Create a horizontal revenue bar chart with the data from the `revenues` field.
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
75fn render_simple_barchart(area: Rect, buf: &mut Buffer) {
76 let data = [
77 ("Sat", 76),
78 ("Sun", 69),
79 ("Mon", 65),
80 ("Tue", 67),
81 ("Wed", 65),
82 ("Thu", 69),
83 ("Fri", 73),
84 ];
85 let data = data
86 .into_iter()
87 .map(|(label, value)| {
88 Bar::default()
89 .value(value)
90 // This doesn't actually render correctly as the text is too wide for the bar
91 // See https://github.com/ratatui/ratatui/issues/513 for more info
92 // (the demo GIFs hack around this by hacking the calculation in bars.rs)
93 .text_value(format!("{value}°"))
94 .style(if value > 70 {
95 Style::new().fg(Color::Red)
96 } else {
97 Style::new().fg(Color::Yellow)
98 })
99 .value_style(if value > 70 {
100 Style::new().fg(Color::Gray).bg(Color::Red).bold()
101 } else {
102 Style::new().fg(Color::DarkGray).bg(Color::Yellow).bold()
103 })
104 .label(label.into())
105 })
106 .collect_vec();
107 let group = BarGroup::default().bars(&data);
108 BarChart::default()
109 .data(group)
110 .bar_width(3)
111 .bar_gap(1)
112 .render(area, buf);
113}
114
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Sourcepub fn block(self, block: Block<'a>) -> Self
pub fn block(self, block: Block<'a>) -> Self
Examples found in repository?
83fn vertical_barchart(temperatures: &[u8]) -> BarChart {
84 let bars: Vec<Bar> = temperatures
85 .iter()
86 .enumerate()
87 .map(|(hour, value)| vertical_bar(hour, value))
88 .collect();
89 let title = Line::from("Weather (Vertical)").centered();
90 BarChart::default()
91 .data(BarGroup::default().bars(&bars))
92 .block(Block::new().title(title))
93 .bar_width(5)
94}
95
96fn vertical_bar(hour: usize, temperature: &u8) -> Bar {
97 Bar::default()
98 .value(u64::from(*temperature))
99 .label(Line::from(format!("{hour:>02}:00")))
100 .text_value(format!("{temperature:>3}°"))
101 .style(temperature_style(*temperature))
102 .value_style(temperature_style(*temperature).reversed())
103}
104
105/// Create a horizontal bar chart from the temperatures data.
106fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
107 let bars: Vec<Bar> = temperatures
108 .iter()
109 .enumerate()
110 .map(|(hour, value)| horizontal_bar(hour, value))
111 .collect();
112 let title = Line::from("Weather (Horizontal)").centered();
113 BarChart::default()
114 .block(Block::new().title(title))
115 .data(BarGroup::default().bars(&bars))
116 .bar_width(1)
117 .bar_gap(0)
118 .direction(Direction::Horizontal)
119}
More examples
93 fn vertical_revenue_barchart(&self) -> BarChart<'_> {
94 let mut barchart = BarChart::default()
95 .block(Block::new().title(Line::from("Company revenues (Vertical)").centered()))
96 .bar_gap(0)
97 .bar_width(6)
98 .group_gap(2);
99
100 for group in self
101 .revenues
102 .iter()
103 .map(|revenue| revenue.to_vertical_bar_group(&self.companies))
104 {
105 barchart = barchart.data(group);
106 }
107 barchart
108 }
109
110 /// Create a horizontal revenue bar chart with the data from the `revenues` field.
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Sourcepub const fn max(self, max: u64) -> Self
pub const fn max(self, max: u64) -> Self
Set the value necessary for a Bar
to reach the maximum height.
If not set, the maximum value in the data is taken as reference.
§Examples
This example shows the default behavior when max
is not set.
The maximum value in the dataset is taken (here, 100
).
use ratatui::widgets::BarChart;
BarChart::default().data(&[("foo", 1), ("bar", 2), ("baz", 100)]);
// Renders
// █
// █
// f b b
This example shows a custom max value.
The maximum height being 2
, bar
& baz
render as the max.
use ratatui::widgets::BarChart;
BarChart::default()
.data(&[("foo", 1), ("bar", 2), ("baz", 100)])
.max(2);
// Renders
// █ █
// █ █ █
// f b b
Sourcepub fn bar_style<S: Into<Style>>(self, style: S) -> Self
pub fn bar_style<S: Into<Style>>(self, style: S) -> Self
Set the default style of the bar.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
It is also possible to set individually the style of each Bar
.
In this case the default style will be patched by the individual style
Examples found in repository?
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Sourcepub const fn bar_width(self, width: u16) -> Self
pub const fn bar_width(self, width: u16) -> Self
Set the width of the displayed bars.
For Horizontal
bars this becomes the height of
the bar.
If not set, this defaults to 1
.
The bar label also uses this value as its width.
Examples found in repository?
83fn vertical_barchart(temperatures: &[u8]) -> BarChart {
84 let bars: Vec<Bar> = temperatures
85 .iter()
86 .enumerate()
87 .map(|(hour, value)| vertical_bar(hour, value))
88 .collect();
89 let title = Line::from("Weather (Vertical)").centered();
90 BarChart::default()
91 .data(BarGroup::default().bars(&bars))
92 .block(Block::new().title(title))
93 .bar_width(5)
94}
95
96fn vertical_bar(hour: usize, temperature: &u8) -> Bar {
97 Bar::default()
98 .value(u64::from(*temperature))
99 .label(Line::from(format!("{hour:>02}:00")))
100 .text_value(format!("{temperature:>3}°"))
101 .style(temperature_style(*temperature))
102 .value_style(temperature_style(*temperature).reversed())
103}
104
105/// Create a horizontal bar chart from the temperatures data.
106fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
107 let bars: Vec<Bar> = temperatures
108 .iter()
109 .enumerate()
110 .map(|(hour, value)| horizontal_bar(hour, value))
111 .collect();
112 let title = Line::from("Weather (Horizontal)").centered();
113 BarChart::default()
114 .block(Block::new().title(title))
115 .data(BarGroup::default().bars(&bars))
116 .bar_width(1)
117 .bar_gap(0)
118 .direction(Direction::Horizontal)
119}
More examples
93 fn vertical_revenue_barchart(&self) -> BarChart<'_> {
94 let mut barchart = BarChart::default()
95 .block(Block::new().title(Line::from("Company revenues (Vertical)").centered()))
96 .bar_gap(0)
97 .bar_width(6)
98 .group_gap(2);
99
100 for group in self
101 .revenues
102 .iter()
103 .map(|revenue| revenue.to_vertical_bar_group(&self.companies))
104 {
105 barchart = barchart.data(group);
106 }
107 barchart
108 }
109
110 /// Create a horizontal revenue bar chart with the data from the `revenues` field.
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
75fn render_simple_barchart(area: Rect, buf: &mut Buffer) {
76 let data = [
77 ("Sat", 76),
78 ("Sun", 69),
79 ("Mon", 65),
80 ("Tue", 67),
81 ("Wed", 65),
82 ("Thu", 69),
83 ("Fri", 73),
84 ];
85 let data = data
86 .into_iter()
87 .map(|(label, value)| {
88 Bar::default()
89 .value(value)
90 // This doesn't actually render correctly as the text is too wide for the bar
91 // See https://github.com/ratatui/ratatui/issues/513 for more info
92 // (the demo GIFs hack around this by hacking the calculation in bars.rs)
93 .text_value(format!("{value}°"))
94 .style(if value > 70 {
95 Style::new().fg(Color::Red)
96 } else {
97 Style::new().fg(Color::Yellow)
98 })
99 .value_style(if value > 70 {
100 Style::new().fg(Color::Gray).bg(Color::Red).bold()
101 } else {
102 Style::new().fg(Color::DarkGray).bg(Color::Yellow).bold()
103 })
104 .label(label.into())
105 })
106 .collect_vec();
107 let group = BarGroup::default().bars(&data);
108 BarChart::default()
109 .data(group)
110 .bar_width(3)
111 .bar_gap(1)
112 .render(area, buf);
113}
Sourcepub const fn bar_gap(self, gap: u16) -> Self
pub const fn bar_gap(self, gap: u16) -> Self
Set the gap between each bar.
If not set, this defaults to 1
.
The bar label will never be larger than the bar itself, even if the gap is sufficient.
§Example
This shows two bars with a gap of 3
. Notice the labels will always stay under the bar.
use ratatui::widgets::BarChart;
BarChart::default()
.data(&[("foo", 1), ("bar", 2)])
.bar_gap(3);
// Renders
// █
// █ █
// f b
Examples found in repository?
106fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
107 let bars: Vec<Bar> = temperatures
108 .iter()
109 .enumerate()
110 .map(|(hour, value)| horizontal_bar(hour, value))
111 .collect();
112 let title = Line::from("Weather (Horizontal)").centered();
113 BarChart::default()
114 .block(Block::new().title(title))
115 .data(BarGroup::default().bars(&bars))
116 .bar_width(1)
117 .bar_gap(0)
118 .direction(Direction::Horizontal)
119}
More examples
93 fn vertical_revenue_barchart(&self) -> BarChart<'_> {
94 let mut barchart = BarChart::default()
95 .block(Block::new().title(Line::from("Company revenues (Vertical)").centered()))
96 .bar_gap(0)
97 .bar_width(6)
98 .group_gap(2);
99
100 for group in self
101 .revenues
102 .iter()
103 .map(|revenue| revenue.to_vertical_bar_group(&self.companies))
104 {
105 barchart = barchart.data(group);
106 }
107 barchart
108 }
109
110 /// Create a horizontal revenue bar chart with the data from the `revenues` field.
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
75fn render_simple_barchart(area: Rect, buf: &mut Buffer) {
76 let data = [
77 ("Sat", 76),
78 ("Sun", 69),
79 ("Mon", 65),
80 ("Tue", 67),
81 ("Wed", 65),
82 ("Thu", 69),
83 ("Fri", 73),
84 ];
85 let data = data
86 .into_iter()
87 .map(|(label, value)| {
88 Bar::default()
89 .value(value)
90 // This doesn't actually render correctly as the text is too wide for the bar
91 // See https://github.com/ratatui/ratatui/issues/513 for more info
92 // (the demo GIFs hack around this by hacking the calculation in bars.rs)
93 .text_value(format!("{value}°"))
94 .style(if value > 70 {
95 Style::new().fg(Color::Red)
96 } else {
97 Style::new().fg(Color::Yellow)
98 })
99 .value_style(if value > 70 {
100 Style::new().fg(Color::Gray).bg(Color::Red).bold()
101 } else {
102 Style::new().fg(Color::DarkGray).bg(Color::Yellow).bold()
103 })
104 .label(label.into())
105 })
106 .collect_vec();
107 let group = BarGroup::default().bars(&data);
108 BarChart::default()
109 .data(group)
110 .bar_width(3)
111 .bar_gap(1)
112 .render(area, buf);
113}
114
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Sourcepub const fn bar_set(self, bar_set: Set) -> Self
pub const fn bar_set(self, bar_set: Set) -> Self
The bar::Set
to use for displaying the bars.
If not set, the default is bar::NINE_LEVELS
.
Sourcepub fn value_style<S: Into<Style>>(self, style: S) -> Self
pub fn value_style<S: Into<Style>>(self, style: S) -> Self
Set the default value style of the bar.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
It is also possible to set individually the value style of each Bar
.
In this case the default value style will be patched by the individual value style
§See also
Bar::value_style
to set the value style individually.
Examples found in repository?
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Sourcepub fn label_style<S: Into<Style>>(self, style: S) -> Self
pub fn label_style<S: Into<Style>>(self, style: S) -> Self
Set the default label style of the groups and bars.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
It is also possible to set individually the label style of each Bar
or BarGroup
.
In this case the default label style will be patched by the individual label style
§See also
Bar::label
to set the label style individually.
Sourcepub const fn group_gap(self, gap: u16) -> Self
pub const fn group_gap(self, gap: u16) -> Self
Set the gap between BarGroup
.
Examples found in repository?
93 fn vertical_revenue_barchart(&self) -> BarChart<'_> {
94 let mut barchart = BarChart::default()
95 .block(Block::new().title(Line::from("Company revenues (Vertical)").centered()))
96 .bar_gap(0)
97 .bar_width(6)
98 .group_gap(2);
99
100 for group in self
101 .revenues
102 .iter()
103 .map(|revenue| revenue.to_vertical_bar_group(&self.companies))
104 {
105 barchart = barchart.data(group);
106 }
107 barchart
108 }
109
110 /// Create a horizontal revenue bar chart with the data from the `revenues` field.
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
Sourcepub fn style<S: Into<Style>>(self, style: S) -> Self
pub fn style<S: Into<Style>>(self, style: S) -> Self
Set the style of the entire chart.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
The style will be applied to everything that isn’t styled (borders, bars, labels, …).
Sourcepub const fn direction(self, direction: Direction) -> Self
pub const fn direction(self, direction: Direction) -> Self
Set the direction of the bars.
Vertical
bars are the default.
§Examples
Vertical bars
█
█ █
f b
Horizontal bars
█foo██
█bar██
Examples found in repository?
106fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
107 let bars: Vec<Bar> = temperatures
108 .iter()
109 .enumerate()
110 .map(|(hour, value)| horizontal_bar(hour, value))
111 .collect();
112 let title = Line::from("Weather (Horizontal)").centered();
113 BarChart::default()
114 .block(Block::new().title(title))
115 .data(BarGroup::default().bars(&bars))
116 .bar_width(1)
117 .bar_gap(0)
118 .direction(Direction::Horizontal)
119}
More examples
111 fn horizontal_revenue_barchart(&self) -> BarChart<'_> {
112 let title = Line::from("Company Revenues (Horizontal)").centered();
113 let mut barchart = BarChart::default()
114 .block(Block::new().title(title))
115 .bar_width(1)
116 .group_gap(2)
117 .bar_gap(0)
118 .direction(Direction::Horizontal);
119 for group in self
120 .revenues
121 .iter()
122 .map(|revenue| revenue.to_horizontal_bar_group(&self.companies))
123 {
124 barchart = barchart.data(group);
125 }
126 barchart
127 }
115fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
116 let bg = Color::Rgb(32, 48, 96);
117 let data = [
118 Bar::default().text_value("Winter 37-51".into()).value(51),
119 Bar::default().text_value("Spring 40-65".into()).value(65),
120 Bar::default().text_value("Summer 54-77".into()).value(77),
121 Bar::default()
122 .text_value("Fall 41-71".into())
123 .value(71)
124 .value_style(Style::new().bold()), // current season
125 ];
126 let group = BarGroup::default().label("GPU".into()).bars(&data);
127 BarChart::default()
128 .block(Block::new().padding(Padding::new(0, 0, 2, 0)))
129 .direction(Direction::Horizontal)
130 .data(group)
131 .bar_gap(1)
132 .bar_style(Style::new().fg(bg))
133 .value_style(Style::new().bg(bg).fg(Color::Gray))
134 .render(area, buf);
135}
Trait Implementations§
Source§impl WidgetRef for BarChart<'_>
impl WidgetRef for BarChart<'_>
Source§fn render_ref(&self, area: Rect, buf: &mut Buffer)
fn render_ref(&self, area: Rect, buf: &mut Buffer)
unstable-widget-ref
only.impl<'a> Eq for BarChart<'a>
impl<'a> StructuralPartialEq for BarChart<'a>
Auto Trait Implementations§
impl<'a> Freeze for BarChart<'a>
impl<'a> RefUnwindSafe for BarChart<'a>
impl<'a> Send for BarChart<'a>
impl<'a> Sync for BarChart<'a>
impl<'a> Unpin for BarChart<'a>
impl<'a> UnwindSafe for BarChart<'a>
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
fn bg<C>(self, color: C) -> T
fn fg<C>(self, color: C) -> T
fn add_modifier(self, modifier: Modifier) -> T
fn remove_modifier(self, modifier: Modifier) -> T
fn reset(self) -> T
Source§fn on_magenta(self) -> T
fn on_magenta(self) -> T
magenta
.Source§fn on_dark_gray(self) -> T
fn on_dark_gray(self) -> T
dark_gray
.Source§fn on_light_red(self) -> T
fn on_light_red(self) -> T
light_red
.Source§fn light_green(self) -> T
fn light_green(self) -> T
light_green
.Source§fn on_light_green(self) -> T
fn on_light_green(self) -> T
light_green
.Source§fn light_yellow(self) -> T
fn light_yellow(self) -> T
light_yellow
.Source§fn on_light_yellow(self) -> T
fn on_light_yellow(self) -> T
light_yellow
.Source§fn light_blue(self) -> T
fn light_blue(self) -> T
light_blue
.Source§fn on_light_blue(self) -> T
fn on_light_blue(self) -> T
light_blue
.Source§fn light_magenta(self) -> T
fn light_magenta(self) -> T
light_magenta
.Source§fn on_light_magenta(self) -> T
fn on_light_magenta(self) -> T
light_magenta
.Source§fn light_cyan(self) -> T
fn light_cyan(self) -> T
light_cyan
.Source§fn on_light_cyan(self) -> T
fn on_light_cyan(self) -> T
light_cyan
.Source§fn not_italic(self) -> T
fn not_italic(self) -> T
ITALIC
modifier.Source§fn underlined(self) -> T
fn underlined(self) -> T
UNDERLINED
modifier.Source§fn not_underlined(self) -> T
fn not_underlined(self) -> T
UNDERLINED
modifier.Source§fn slow_blink(self) -> T
fn slow_blink(self) -> T
SLOW_BLINK
modifier.Source§fn not_slow_blink(self) -> T
fn not_slow_blink(self) -> T
SLOW_BLINK
modifier.Source§fn rapid_blink(self) -> T
fn rapid_blink(self) -> T
RAPID_BLINK
modifier.Source§fn not_rapid_blink(self) -> T
fn not_rapid_blink(self) -> T
RAPID_BLINK
modifier.Source§fn not_reversed(self) -> T
fn not_reversed(self) -> T
REVERSED
modifier.HIDDEN
modifier.HIDDEN
modifier.Source§fn crossed_out(self) -> T
fn crossed_out(self) -> T
CROSSED_OUT
modifier.Source§fn not_crossed_out(self) -> T
fn not_crossed_out(self) -> T
CROSSED_OUT
modifier.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more