【发布时间】:2022-01-08 21:06:33
【问题描述】:
我很喜欢使用 tidyverse 和 ggplot。我正在尝试生成一个交互式图表以使用 flexdashboard 进行部署。因此,我试图在 plotly 中生成我常用的 ggplots。
假设我有以下数据框:
data.frame(id = c(1:5),
product = c("product1","product2","product1","product3","product2"),
variable = c("var1","var1","var3","var2","var1"),
price = c(100,120,140,90,80))
有输出:
id product variable price
1 1 product1 var1 100
2 2 product2 var1 120
3 3 product1 var3 140
4 4 product3 var2 90
5 5 product2 var1 80
如果我想在绘图上显示所有这些,我会在 ggplot 中执行以下操作:
library(tidyverse)
library(hrbrthemes)
data.frame(id = c(1:5),
product = c("product1","product2","product1","product3","product2"),
variable = c("var1","var1","var3","var2","var1"),
price = c(100,120,140,90,80)) %>%
ggplot(aes(x = id, y = price, color = variable)) +
geom_point() +
facet_wrap(~product) +
theme_ft_rc()
哪个会产生:
我知道我可以通过使用subplot() 在情节上实现类似的目标
功能。问题是我有 14-28 个类别可以绘制为方面。据我了解,这意味着我必须制作 14-28 个图,然后将它们排列在网格中。这似乎有点乏味,我想知道是否有更有效的方法来实现这一点,例如 ggplot 中的 facet 选项。我还在另一篇文章中获得了一段代码:
library(plotly)
dataframe <- data.frame(id = c(1:5),
product = c("product1","product2","product1","product3","product2"),
variable = c("var1","var1","var3","var2","var1"),
price = c(100,120,140,90,80)) %>%
pivot_wider(names_from = "product", values_from = "price")
vars <- setdiff(names(dataframe),"id")
plots <- lapply(vars, function(var){
plot_ly(dataframe, x = ~id, color =~variable, y = as.formula(paste0("~",var))) %>%
add_bars(name = var)
})
subplot(plots, nrows = length(plots), shareX = TRUE, titleX = FALSE)
产量:
并且需要使用 tidyr 的 pivot_wider() 函数和示例框架中的 product 列。但是,我的真实列包含数字和字符,使用上述示例代码时会产生错误。变量列也以更奇怪的方式显示。是否有解决此问题的方法,或者是真正为每个绘图手动编写代码的最佳方法?
【问题讨论】:
标签: r ggplot2 plotly flexdashboard ggplotly