根据 R 和 plotly 中的范围制作堆积条形图

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

我想在 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

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

我尽力理解了。首先将萼片长度划分为所需的类别 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')

已编辑 对于未堆叠但按 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 以创建所需的字符串,然后定义要在 tooltip 中显示的 aesggplotly.

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