-1

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

2 回答 2

2

我尽力去理解。首先将萼片长度划分为所需的类别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. 这里还需要更改legend.title字体大小theme以适应ggplotly页边距。

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

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"))
于 2017-10-27T11:52:52.743 回答
0

尝试使用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
> 
于 2017-10-27T10:26:51.957 回答