Files
2026-07-03 15:56:07 +08:00

132 lines
4.7 KiB
Markdown

# Bar Charts
Bar Charts are drawn with `BarRenderer` by converting xy values of an `XYSeries` into
vertical bars. The height of the vertical bar is calculated from the yVal and the base
of the bar is calculated from the plot's range origin value.
![image](images/screens/bar_horiz.png)
# Basic Usage
Rendering an `XYSeries` as a bar chart is as simple as adding the series to an `XYPlot` with an
instance of `BarFormatter`:
```java
// create a bar formatter with a red fill color and a white outline:
BarFormatter bf = new BarFormatter(Color.RED, Color.WHITE);
plot.addSeries(series, bf);
```
# BarRenderer
Unlike most other renderers, much of the visual configuration of a bar chart is configured through it's `BarRenderer`.
`BarRenderer` provides methods for setting how the width of each bar should be calculated, the space between each `Bar`
and what style of visual grouping to use.
##### Getting the BarRenderer Instance
Many of the topics below require access to the `BarRenderer` instance to be set. Each instance of
`XYPlot` contains it's own unique `Renderer` instances. To retrieve the `BarRenderer`
instance from an `XYPlot`:
```java
BarRenderer renderer = plot.getRenderer(BarRenderer.class);
```
# BarGroup
A `BarGroup` is automatically generated to group values from one or more series by their index values.
All `Bar` instances belong to a `BarGroup`, even if there is only a single `XYSeries` that exists.
A common use case of bar charts is to represent a group of two or more values for a given interval as
individual bars, for example the number of wins and losses for a baseball team for every month over the course
of a year.
To model this in Androidplot, create two instances of `XYSeries`; one for wins and one for losses, each
with exactly 12 elements (one for each day of the month):
```java
XYSeries wins = new SimpleXYSeries(SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "wins", 3, 4, 5, 3, 2, 3, 5, 6, 2, 1, 3, 1);
XYSeries losses = new SimpleXYSeries(SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "losses", 0, 1, 1, 0, 1, 0, 0, 0, 2, 1, 0, 1);
```
Each series is then added to the plot with it's own formatter:
```java
// draw wins bars with a green fill:
BarFormatter winsFormatter = new BarFormatter(Color.GREEN, Color.BLACK);
plot.addSeries(wins, winsFormatter);
// draw losses bars with a red fill:
BarFormatter lossesFormatter = new BarFormatter(Color.RED, Color.BLACK);
plot.addSeries(losses, lossesFormatter);
```
The pairs of wins/losses bars are then drawn side-by-side for each of the 12 indexes. Androidplot
knows to do this because `BarRenderer` (the renderer used to draw series associated with a `BarFormatter`)
extends [GroupRenderer](grouprenderer.md).
# BarRenderer Styles
`BarRenderer` provides three grouping styles that may be used when rendering two or more XYSeries:
`OVERLAID`, `STACKED`, `SIDE_BY_SIDE`
##### OVERLAID (default)
Bars in the same grouping are overlaid on each-other, the bars being drawn by yVal in descending order.
![image](images/bargroup_overlaid.png)
To use:
```java
barRenderer.setBarOrientation(BarRenderer.BarOrientation.OVERLAID);
```
##### STACKED
Bars in the same group are stacked on top of each-other. Limitations:
* Range Origin must be set to 0.
* All `XYSeries` must contain no negative values.
![image](images/bargroup_stacked.png)
To use:
```java
barRenderer.setBarOrientation(BarRenderer.BarOrientation.STACKED);
```
##### SIDE_BY_SIDE
Bars in the same group are drawn next to one another.
![image](images/bargroup_side_by_side.png)
To use:
```java
barRenderer.setBarOrientation(BarRenderer.BarOrientation.SIDE_BY_SIDE);
```
By default there is no spacing between bars in the same `BarGroup` in this mode. You can add spacing
by setting a left and right margin on your BarFormatter instances:
```java
barFormatter.setMarginLeft(PixelUtils.dpToPix(1));
barFormatter.setMarginRight(PixelUtils.dpToPix(1));
```
# BarGroup Widths & Spacing
When configuring BarGroup widths and spacing, there are two mutually exclusive methods that can be used;
`FIXED_WIDTH` and `FIXED_GAP`.
![image](images/bargroup_spacing.png)
##### FIXED_WIDTH
The exact size of the `BarGroup` is specified in pixels and the space between each `BarGroup`
is dynamically calculated based on that size.
```java
barRenderer.setBarGroupWidth(BarRenderer.BarGroupWidthMode.FIXED_WIDTH, PixelUtils.dpToPix(25));
```
##### FIXED_GAP
The exact size of the "gap" between each `BarGroup` is specified in pixels and the size of each `BarGroup`
is dynamically calculated based on that spacing.
```java
barRenderer.setBarGroupWidth(BarRenderer.BarGroupWidthMode.FIXED_GAP, PixelUtils.dpToPix(5));
```
# Example
See the DemoApp's [bar chart example source](../demoapp/src/main/java/com/androidplot/demos/BarPlotExampleActivity.java).