Making a stacked bar plot based on ranges in R and plotly

前端 未结 2 1897
北海茫月
北海茫月 2021-01-29 06:51

I want to create a stacked bar chart in R and plotly using iris dataset. In the x-axis, I want to set limits like iris_limits below in the code and the y-axis should contain all

相关标签:
2条回答
  • 2021-01-29 07:21

    I tried my best to understand. First dividing the sepal length to the desired categories iris_limits: "1-3","3-6","6-9"

    iris$iris_limits <- cut(iris$Sepal.Length, c(1,3,6,9))
    

    Note: no sepal length is in between 1-3, so you only have 2 groups.

    Then you want each sepal length limit as a separate bar on the x axis, and each individual sepal length falling into category to be bar stacked onto each other? You linked to a stack bar chart with varying color for the stacked bars, is this what you want?

    Create an ID for each sepal length:

    iris$ID <- factor(1:nrow(iris))
    

    Plot, set color=~ID if you want different colors for the stacked bars:

    library(plotly)
    p <- plot_ly(iris, x = ~iris_limits, y = ~Sepal.Length, type = 'bar', color=~ID) %>%
      layout(yaxis = list(title = 'Count'), barmode = 'stack')
    

    EDITED For version that is not stacked but grouped by iris_limits, I switched to ggplot2 to make use of facet_wrap functionality to segregate by iris_limits, then use ggplotly.

    gg <- ggplot(iris, aes(x=ID, y=Sepal.Length, fill=iris_limits)) + 
      geom_bar(stat="identity", position="dodge") +
      facet_wrap(~iris_limits, scales="free_x", labeller=label_both) +
      theme_minimal() + xlab("") + ylab("Sepal Length") +
      theme(axis.text.x=element_blank())
    ggplotly(gg)
    

    EDITED: Re: Changing legend title and tooltip display

    To change the legend title, use labs. Here it was also necessary to change the legend.title font size under theme to fit the ggplotly margins.

    To change the tooltip text, add text parameter to aes to create desired character string, then define aes values to be displayed in tooltip in ggplotly.

    gg <- ggplot(iris, aes(x=ID, y=Sepal.Length, fill=iris_limits,
                       text=paste("Sepal Length:", Sepal.Length, "cm"))) + 
      geom_bar(stat="identity", position="dodge") +
      facet_wrap(~iris_limits, scales="free_x") +
      theme_minimal() + xlab("") + ylab("Sepal Length (cm)") +
      theme(axis.text.x=element_blank(), legend.title=element_text(size=10)) +
      labs(fill="Sepal \nLength (cm)")
    ggplotly(gg, tooltip=c("x", "text"))
    
    0 讨论(0)
  • 2021-01-29 07:31

    Try using cut:

    library(plotly)
    iris$iris_limits <- as.numeric(cut(iris$Sepal.Length,3))
    p <- plot_ly(iris, x = ~iris_limits, y = ~Sepal.Length, type = 'bar', name = 
                   'Sepal') %>%
      layout(yaxis = list(title = 'Count'), barmode = 'group')
    p
    

    The grouping details:

    > iris$Sepal.Length[iris$iris_limits==1]
     [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.4 5.1 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8
    [29] 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 5.5 4.9 5.2 5.0 5.5 5.5 5.4 5.5 5.5
    [57] 5.0 5.1 4.9
    > iris$Sepal.Length[iris$iris_limits==2]
     [1] 5.8 5.7 5.7 6.4 6.5 5.7 6.3 6.6 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.7 6.0 5.7 5.8 6.0
    [29] 6.0 6.7 6.3 5.6 6.1 5.8 5.6 5.7 5.7 6.2 5.7 6.3 5.8 6.3 6.5 6.7 6.5 6.4 5.7 5.8 6.4 6.5 6.0 5.6 6.3 6.7 6.2 6.1
    [57] 6.4 6.4 6.3 6.1 6.3 6.4 6.0 6.7 5.8 6.7 6.7 6.3 6.5 6.2 5.9
    > iris$Sepal.Length[iris$iris_limits==3]
     [1] 7.0 6.9 6.8 7.1 7.6 7.3 7.2 6.8 7.7 7.7 6.9 7.7 7.2 7.2 7.4 7.9 7.7 6.9 6.9 6.8
    > 
    
    0 讨论(0)
提交回复
热议问题