【问题标题】:Making a stacked bar plot based on ranges in R and plotly根据 R 和 plotly 中的范围制作堆积条形图
【发布时间】:2018-04-08 22:08:46
【问题描述】:

我想在 R 中创建一个堆积条形图,并使用 iris 数据集进行绘图。在 x 轴上,我想在代码中设置像 iris_limits 这样的限制,并且 y 轴应该包含适合这些范围的所有 Sepal.Length 值。我想将值作为单个向量传递。此外,如果可以通过了解 Sepal.Length 的范围而不是对其进行硬编码来使限制动态化,请提供帮助。我写了一个带有值的基本脚本来给你一个想法。谢谢。

library(plotly)
iris_limits <- c("1-4", "4-6", "6-8")
sepal <- c(2.4,5.4,7.1)
data <- data.frame(iris_limits, sepal)
p <- plot_ly(data, x = ~iris_limits, y = ~sepal, type = 'bar', name = 
'Sepal') %>%
layout(yaxis = list(title = 'Count'), barmode = 'group')
p

【问题讨论】:

  • 每个Sepal.Length 组堆叠了什么? Species?
  • iris_limits
  • 那么一根柱子,柱子数是根据 Sepal.Length 范围划分(堆叠)的?
  • 在 x 轴上,我需要它为“1-3”、“3-6”、“6-9”。如果这可以动态生成而无需硬编码。另外,我想将 iris$Sepal.Length 作为一个向量传递,其中 Sepal.Length 的每个值都是一个应该落入上述范围之一的条形。从而使其成为堆叠条形图。这是我的需要?
  • @Djork,请通过此链接帮助我:stackoverflow.com/questions/47278387/…

标签: r ggplot2 plotly ggplotly


【解决方案1】:

我尽力去理解。首先将萼片长度划分为所需的类别iris_limits: "1-3","3-6","6-9"

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

注意:没有萼片长度在 1-3 之间,所以你只有 2 组。

那么您希望每个萼片长度限制在 x 轴上作为一个单独的条形图,并且每个单独的萼片长度落入类别中以条形堆叠在一起?您链接到堆叠条形图的堆叠条形图,其颜色各不相同,这是您想要的吗?

为每个萼片长度创建一个 ID:

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

绘图,如果您想要堆叠条的不同颜色,请设置color=~ID

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

EDITED 对于未堆叠但按iris_limits 分组的版本,我切换到ggplot2 以利用facet_wrap 功能按iris_limits 隔离,然后使用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)

已编辑:回复:更改图例标题和工具提示显示

要更改图例标题,请使用labs。这里还需要更改theme 下的legend.title 字体大小以适应ggplotly 的边距。

要更改工具提示文本,请将text 参数添加到aes 以创建所需的字符串,然后在ggplotly 中定义要在tooltip 中显示的aes 值。

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"))

【讨论】:

  • 非常好,但几乎接近,这些 sepal.length 限制作为 x 轴上的单独条应该垂直于 x 轴而不是平行,其次,不需要右滑块,请帮助.
  • 如果它垂直于 x 轴,那么它就不是堆叠条,您真的想要多个按萼片长度限制分组的条吗?
  • 是多个条形图,如分组条形图。请在此处查看此链接。对不起,但我认为分组和堆叠是相同的。 plot.ly/r/bar-charts
  • 非常感谢 Djork,非常感谢您的帮助。
  • @AshminKaul 对答案进行投票并标记为已回答是一个很好的做法!
【解决方案2】:

尝试使用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

分组详情:

> 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
> 

【讨论】:

  • 嗨,amrrs,谢谢,但这是非常不同的,我需要像“1-3”、“3-6”、“6-9”这样的x轴范围,并适合所有的萼片。该范围内的长度值。每个 sepal.length 值应该代表一个条形图。再次感谢。
  • 您是否尝试将其悬停?这就是它的作用。
  • 在您的 x 轴上,我看到 1,2 和 3,我需要它为“1-3”、“3-6”、“6-9”。另外,我想将 iris$Sepal.Length 作为一个向量传递,其中 Sepal.Length 的每个值都是一个应该落入上述范围之一的条形。从而使其成为堆叠条形图。这是我的需要?
  • plot.ly/r/bar-charts/#stacked-bar-chart ,此链接中的分组条形图可能会有所帮助。
  • 感谢您的帮助 amrrs,谢谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2019-08-09
  • 2022-01-18
  • 2017-07-09
  • 1970-01-01
  • 2019-02-05
  • 2020-07-17
相关资源
最近更新 更多