Introduction to Customizing Bar Charts in Plotly R
In this article, we will explore how to customize a bar chart in Plotly R. We will cover removing the red line from the chart and adding average value of ‘share’ as a horizontal line on the Y axis.
Installing Required Libraries
Before we begin, make sure you have installed the required libraries. You can install them using the following command:
install.packages("plotly", dependencies = TRUE)
library(plotly)
Creating a Sample Dataset
We will create a sample dataset to demonstrate how to customize the bar chart.
df <- data.frame(
model = c("A", "B", "C","D","E","F"),
share = c(12,20,15,9,60,20),
sale = c(16,25,18,14,67,28),
cost = c(14,19,28,24,57,28)
)
df$model <- factor(df$model, levels = arrange(df, desc(df$cost))$model)
Step 1: Removing the Red Line from the Chart
To remove the red line from the chart, we need to change the color of the line to ’transparent’.
df_long <- df %>%
pivot_longer(
cols = -model
)
df_long %>%
filter(name != "cost") %>%
plot_ly(x = ~model, y = ~value, color = ~name, type = "bar",
customdata = ~name, colors = c("blue", "gray"),
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: %{customdata}<extra></extra>")) %>%
add_lines(inherit = F, data = df, x = ~model,
y = ~cost, color = I("transparent"),
name = "cost",
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: cost<extra></extra>")) %>%
add_annotations(data = df, x = ~model, y = ~cost, text = ~cost,
bgcolor = "white", bordercolor = "black",
xshift = 15, yshift = 15, showarrow = F) %>%
layout(barmode = "group",
shapes = list(type = "line", x0 = 0, x1 = 1, xref = "paper",
y0 = mean(df$share), y1 = mean(df$share),
line = list(color = "red"),
name = "Average Share")) -> pL
Step 2: Adding Average Value of ‘share’ as a Horizontal Line
To add average value of ‘share’ as a horizontal line, we need to use the add_shape
function in Plotly.
df_long %>%
filter(name != "cost") %>%
plot_ly(x = ~model, y = ~value, color = ~name, type = "bar",
customdata = ~name, colors = c("blue", "gray"),
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: %{customdata}<extra></extra>")) %>%
add_lines(inherit = F, data = df, x = ~model,
y = ~cost, color = I("transparent"),
name = "cost",
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: cost<extra></extra>")) %>%
add_annotations(data = df, x = ~model, y = ~cost, text = ~cost,
bgcolor = "white", bordercolor = "black",
xshift = 15, yshift = 15, showarrow = F) %>%
layout(barmode = "group",
shapes = list(type = "line", x0 = 0, x1 = 1, xref = "paper",
y0 = mean(df$share), y1 = mean(df$share),
line = list(color = "red"),
name = "Average Share")) %>%
add_shape(x0 = 0, x1 = 1, xref = "paper",
y0 = mean(df$share), y1 = mean(df$share),
line = list(color = "blue", dash = "dash"),
name = "Average Share Line") %>% pL
Step 3: Adding Interactivity to the Chart
To add interactivity to the chart, we need to use the htmlwidgets::onRender
function in Plotly.
pL <- renderPlotly({
df_long %>%
filter(name != "cost") %>%
plot_ly(x = ~model, y = ~value, color = ~name, type = "bar",
customdata = ~name, colors = c("blue", "gray"),
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: %{customdata}<extra></extra>")) %>%
add_lines(inherit = F, data = df, x = ~model,
y = ~cost, color = I("transparent"),
name = "cost",
hovertemplate = paste0("Model: %{x}<br>Value: %{y}<br>",
"Name: cost<extra></extra>")) %>%
add_annotations(data = df, x = ~model, y = ~cost, text = ~cost,
bgcolor = "white", bordercolor = "black",
xshift = 15, yshift = 15, showarrow = F) %>%
layout(barmode = "group",
shapes = list(type = "line", x0 = 0, x1 = 1, xref = "paper",
y0 = mean(df$share), y1 = mean(df$share),
line = list(color = "red"),
name = "Average Share")) %>%
add_shape(x0 = 0, x1 = 1, xref = "paper",
y0 = mean(df$share), y1 = mean(df$share),
line = list(color = "blue", dash = "dash"),
name = "Average Share Line") %>%
htmlwidgets::onRender(or)
})
Conclusion
In this article, we demonstrated how to customize a bar chart in Plotly R by removing the red line from the chart and adding average value of ‘share’ as a horizontal line. We also added interactivity to the chart using the htmlwidgets::onRender
function.
Last modified on 2024-10-21