Bring single, grouped, and horizontally stacked bar charts to your data apps.
Overview
Bunifu Horizontal Chart is a chart component that presents datasets on proportional horizontal bars. Here, the data categories are placed on the graph's vertical axis, while the numerical values are placed on the horizontal axis of the graph.
This chart tool enables you to display lengthy discrete data from a category while still leaving room for textual information, allowing the report viewer to immediately see comparative relationships and approximate numeric values. The example below highlights the real value of a bar chart in telling the "story" of the data.
Getting Started
Getting started with design view
This section explains the steps required to start creating a simple horizontal bar chart and demonstrate the basic property usage of the chart.
Step 1: Drag the canvas control to the form from the toolbox and set padding to it.
Step 2: In the property window of the canvas, access the labels property, and add the following values in the string collection editor window as shown below:
Step 3: From the toolbox drag and dropBunifuHorizontalBar to the form.
Step 4: Set the label property of BunifuHorizontalBar to, for example, (Net income profits for Q1 2021 (in billion U.S dollars)
Step 5: On the target property of the Horizontal bar component select bunifuCanvas1 as the target component.
Step 6: Access the Data property of BunifuHorizontalBar, and add the following values to the collection editor displayed as shown below:
Step 7: Go to the colors/BackgroundColor property of the Horizontal Bar and set the following color in the color collection editor:7, 162, 135
Step 8: Run the application
Alternatively, we can code and render a bar chart without using the design view. Here's how to do it:
Code View
voidrenderHorizontalChart() { Bunifu.Charts.WinForms.ChartTypes.BunifuHorizontalBarChart bunifuHChart = new Bunifu.Charts.WinForms.ChartTypes.BunifuHorizontalBarChart();
/* * For this example we will use random numbers */var r =newRandom();/* * Add your data from your source - accepts double list * Below is an example from a random number */List<double> data =newList<double>();for (int i =0; i <5; i++) {data.Add(r.NextDouble()); }/* * Set your data */bunifuHChart.Data= data;/* * Specify the target canvas */bunifuHChart.TargetCanvas= bunifuChartCanvas1;/* * Add labels to your canvas * Label count should correspond to data count for charts like Bar charts */bunifuChartCanvas1.Labels=newstring[] { "Label1","Label2","Label3","Label4","Label5" };/* * Beautify the chart by sepcifying the colors * Color count should correspond to data count */List<Color> bgColors =newList<Color>();bgColors.Add(Color.Red);bgColors.Add(Color.Blue);bgColors.Add(Color.Green);bgColors.Add(Color.Gray);bgColors.Add(Color.Purple);bunifuHChart.BackgroundColor= bgColors; }
Private Sub renderHorizontalChart() Dim bunifuHChart As Bunifu.Charts.WinForms.ChartTypes.BunifuHorizontalBarChart = New Bunifu.Charts.WinForms.ChartTypes.BunifuHorizontalBarChart()
' ' For this example we will use random numbers ' Dim r = New Random() ' ' Add your data from your source - accepts double list ' Below is an example from a random number ' Dim data As List(Of Double) = New List(Of Double)() For i As Integer = 0 To 5 - 1 data.Add(r.NextDouble()) Next ' ' Set your data ' bunifuHChart.Data = data ' ' Specify the target canvas ' bunifuHChart.TargetCanvas = bunifuChartCanvas1 ' ' Add labels to your canvas ' Label count should correspond to data count for charts like Bar charts ' bunifuChartCanvas1.Labels = New String() {"Label1", "Label2", "Label3", "Label4", "Label5"} ' ' Beautify the chart by sepcifying the colors ' Color count should correspond to data count ' Dim bgColors As List(Of Color) = New List(Of Color)() bgColors.Add(Color.Red) bgColors.Add(Color.Blue) bgColors.Add(Color.Green) bgColors.Add(Color.Gray) bgColors.Add(Color.Purple) bunifuHChart.BackgroundColor = bgColorsEnd Sub
Let us examine Bunifu Horizontal Bar charting properties.
Creating Your Data
1. Target Canvas
This property gets or sets the canvas on which the horizontal bar chart will be displayed. Multiple horizontal bar charts with distinct datasets can be targeted on a single canvas, creating grouped or horizontally stacked charts.
2. Data (numerical data)
This property gets or sets a collection of both negative and positive values that the canvas will be present on the X-Axis proportionally for the horizontal bar value. The order in which data values are added to the property corresponds to how the canvas label values are put.
Setting and assigning data to the horizontal bar chart can be done by either using the Data property found on the property pane of the design mode or using code. The example below illustrates using both C# and VB.NET codes to populate the horizontal bar chart with a sorted data at run-time:
publicclassFoodRevenueData {publicdouble USData { get; set; }publicdouble GermanData { get; set; }publicdouble KenyanData { get; set; }publicdouble FranceData { get; set; }publicdouble UKData { get; set; }publicdouble ChinaData { get; set; }publicdouble ItalyData { get; set; }publicdouble SwitzerLandData { get; set; } }privatevoidRevenueForm_Load(object sender,EventArgs e) { //Set data to the class propertiesFoodRevenueData data =newFoodRevenueData() { USData =44727, GermanData =11970, FranceData =11295, ChinaData =18205, ItalyData =13265, SwitzerLandData =21133, KenyanData =23014, UKData =42299 }; //map the property values of the class with its key(the country!)Dictionary<String,Double> revenueByCountry =newDictionary<string,double>();revenueByCountry.Add("United States of America",data.USData);revenueByCountry.Add("German",data.GermanData);revenueByCountry.Add("France",data.FranceData);revenueByCountry.Add("China",data.ChinaData);revenueByCountry.Add("Italy",data.ItalyData);revenueByCountry.Add("SwitzerLand",data.SwitzerLandData);revenueByCountry.Add("Kenya",data.KenyanData);revenueByCountry.Add("United Kingdom",data.UKData);/* * sort data in the dictionary by value in a descending order and assign the data to the list */List<string> y_AxisLabels =newList<string>();List<double> horizontalBarData =newList<double>();foreach (var countryData inrevenueByCountry.OrderByDescending(x=>x.Value)) {y_AxisLabels.Add(countryData.Key);horizontalBarData.Add(countryData.Value); } //assign the valuesbunifuChartCanvas1.Labels=y_AxisLabels.ToArray();bunifuHorizontalBarChart1.Data= horizontalBarData; }
Option Infer OnPublic Class FoodRevenueData Public Property USData() As Double Public Property GermanData() As Double Public Property KenyanData() As Double Public Property FranceData() As Double Public Property UKData() As Double Public Property ChinaData() As Double Public Property ItalyData() As Double Public Property SwitzerLandData() As DoubleEnd Class Private Sub RevenueForm_Load(ByVal sender As Object, ByVal e As EventArgs) 'Set data to the class properties Dim data As New FoodRevenueData() With { .USData = 44727, .GermanData = 11970, .FranceData = 11295, .ChinaData = 18205, .ItalyData = 13265, .SwitzerLandData = 21133, .KenyanData = 23014, .UKData = 42299 } 'map the property values of the class with its key(the country!) Dim revenueByCountry As New Dictionary(Of String, Double)() revenueByCountry.Add("United States of America", data.USData) revenueByCountry.Add("German", data.GermanData) revenueByCountry.Add("France", data.FranceData) revenueByCountry.Add("China", data.ChinaData) revenueByCountry.Add("Italy", data.ItalyData) revenueByCountry.Add("SwitzerLand", data.SwitzerLandData) revenueByCountry.Add("Kenya", data.KenyanData) revenueByCountry.Add("United Kingdom", data.UKData)' ' * sort data in the dictionary by value in a descending order and' assign the data to the list' Dim y_AxisLabels As New List(Of String)() Dim horizontalBarData As New List(Of Double)() For Each countryData In revenueByCountry.OrderByDescending(Function(x) x.Value) y_AxisLabels.Add(countryData.Key) horizontalBarData.Add(countryData.Value) Next countryData 'assign the values bunifuChartCanvas1.Labels = y_AxisLabels.ToArray() bunifuHorizontalBarChart1.Data = horizontalBarData End Sub
Here's is the output of the code:
3. Label (Legend label)
This property gets and sets the text to display on the chart’s legend. To format the label, use the Legend properties available from the canvas properties.
Styling the Bars Appearance
1. BackgroundColor
This property gets or sets the bar's background color value. We can specify the colors using the Red Green Blue (RGB) color format as well as the Alpha, Red, Green, and Blue (ARGB) color values in the color collection editor. By specifying a single color value in the property, the background color of all the bars in the canvas will be set to that value.
The figure below is an illustration where we have specified the ARGB color value 160, 7, 162, 135 in the color collection editor to render the bar's background color with a transparency view:
Each bar can be customized by adding additional color sets to the color selection editor. However, let us add the background colors using code that will be executed on run-time. The following code demonstrates the BackgroundColor property set with a list of colors, that will apply a distinct background color to each horizontal bar during a form load event:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Dim colorsList As New List(Of Color)() colorsList.AddRange(New Color(){ Color.FromArgb(7,162,135), Color.FromArgb(204,255,102), Color.FromArgb(82,72,156), Color.FromArgb(64,98,187), Color.FromArgb(83,62,45) }) bunifuHorizontalBarChart1.BackgroundColor = colorsList End Sub
Here's the output of a multi-colored horizontal bar chart from the code above:
When using a multi-colored horizontal bar chart it is advisable to hide the chart's legend and ensure the X-axis is labelled to convey the values meaning.
To hide the legend access the canvas'sLegendDisplay property and set it to False. Whereas to label the X-axis, go to the XAxesLabel property and set to, for example, "Share of playing time (in %)".
2. BorderColor
This property gets and sets a color value property to the bar’s borders. We can specify the colors using the .NET Framework colors, or a custom RGB standard color format, or the ARGB color format. Below is a sample illustration of the border color applied to the bar. We have specified again an RGB color of 240, 246, 110. Here's the output:
🕵️♂️ To be able to see the border we should increase the width of the border using theBorderWidth property. In the example above we have set a border width of 4.
Additionally, we can specify different border colors for each bar by providing an array of colors in the color collection editor, but let's do so using the code method, where we shall assign the bordercolor prop with a list variable of type color:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Dim colorList As New List(Of Color)() colorList.AddRange(New Color() { Color.FromArgb(240, 246, 110), Color.FromArgb(45, 45, 42), Color.FromArgb(50, 13, 109), Color.FromArgb(67, 100, 54), Color.FromArgb(90, 210, 244), Color.FromArgb(159, 164, 169) })
bunifuHorizontalBarChart1.BorderColor = colorList End Sub
Here's the output of the code above which sets colored borders for each horizontal bar.
3. BorderSkipped
This property gets or sets a side value that conceals the border-stroke of the bar on the specified side. It has the following side values:
a) Top - hides the top border-stroke of each horizontal bar rendered.
b) Bottom - hides the bottom border-stroke of each horizontal bar rendered
c) Left - hides the left border-stroke of each horizontal bar rendered
d) Right - hides the right border-stroke of each horizontal bar rendered.
e) False - shows border-strokes on all the four sides of each horizontal bar rendered.
The following conditions must be met for the property to function properly:
a) Ensure that the BorderWidth prop is not set to 0.
b) Ensure that theBorderColor prop is set to a visible color.
The following code shows how to set the values of the BorderSkipped property at run-time by using Bunifu Radio Button
Private Sub topBunifuRadioButton_CheckedChanged2(ByVal sender As Object, ByVal e As Bunifu.UI.WinForms.BunifuRadioButton.CheckedChangedEventArgs)
If e.Checked Then bunifuHorizontalBarChart1.BorderSkipped ="top" End If End Sub Private Sub bottomBunifuRadioButton_CheckedChanged2(ByVal sender As Object, ByVal e As Bunifu.UI.WinForms.BunifuRadioButton.CheckedChangedEventArgs)
If e.Checked Then bunifuHorizontalBarChart1.BorderSkipped ="bottom" End If End Sub Private Sub leftBunifuRadioButton_CheckedChanged2(ByVal sender As Object, ByVal e As Bunifu.UI.WinForms.BunifuRadioButton.CheckedChangedEventArgs)
If e.Checked Then bunifuHorizontalBarChart1.BorderSkipped ="left" End If End Sub Private Sub rightBunifuRadioButton_CheckedChanged2(ByVal sender As Object, ByVal e As Bunifu.UI.WinForms.BunifuRadioButton.CheckedChangedEventArgs)
If e.Checked Then bunifuHorizontalBarChart1.BorderSkipped ="right" End If End Sub Private Sub falseBunifuRadioButton_CheckedChanged2(ByVal sender As Object, ByVal e As Bunifu.UI.WinForms.BunifuRadioButton.CheckedChangedEventArgs)
If e.Checked Then bunifuHorizontalBarChart1.BorderSkipped ="false" End If End Sub
4. BorderWidth
This property gets and sets an integer value that can modify the width of the bar’s border.
Hover Event properties
1. HoverBackgroundColor
This property sets a back color value to a horizontal bar on which the mouse pointer is suspended.
2. HoverBorderColor
This property changes the color of the border around a horizontal bar that the mouse pointer is hovering over.
3. HoverBorderWidth
This property sets an integer value that changes the width of the boundary of a horizontal bar over which the mouse pointer is hovering.
Creating Horizontal Stacked Bar Charts
Bunifu Horizontal bar can also be set to render groups of segmented bars. Typically, each horizontal bar in the graph represents a data category that is further subdivided into stacked subcategories of datasets. It helps to know which subcategory contributes the most or the least to a data variable.
To stack groups of horizontal bars, simply set the X-AxisStacked property of the canvas to true.
The X-AxisStacked property is effective in rendering stacked bars when a canvas has multiple groups of horizontal bars within a category.
The following example shows three horizontal bars each containing different datasets, stacked on top of one another.
Take Away
Bunifu Horizontal Chart is a great chart tool. With minimal code generation, you can render a stunning horizontal bar chart for your data analysis applications. It is straightforward to read data; We can quickly determine which of the elements ahead of us is longer, which is the shortest.
What you should do is consider what you are trying to say about the values. Data Visualization is more than pointing out information: you’re usually presenting this information to your application users to get them to do something or learn something new.