📜  在 R 中使用 Plotly 创建交互式 ggplot2 图

📅  最后修改于: 2022-05-13 01:55:30.296000             🧑  作者: Mango

在 R 中使用 Plotly 创建交互式 ggplot2 图

“一张图片胜过一千个字”,如果用户可以与之交互,那张图片会更具表现力。因此出现了“交互式图形或图表”的概念。交互式图表允许演示者和观众更自由,因为它们允许用户放大和缩小、悬停和阅读与标记相关的信息、获取工具提示信息等。R 提供了许多包来制作交互式图表。在本文中,我们将重点介绍 plotly 和 ggplot。

Ggplot是 tidyverse 在 R 中的一个包。它基于 Leland Wilkinson 的图形语法。 ggplot 使用图形语法中列出的原则创建复杂而错综复杂的绘图。用户可以使用所有类型的数据,例如单变量、多变量或分类数据来创建数据。它旨在替代 R 中的基本图形包,现在是 R 中最流行的数据可视化包之一。

但是,ggplot 不能制作交互式绘图。为了帮助 ggplot 创建交互式绘图,我们可以使用一个名为 plotly 的包。

Plotly是 R 中的一个开源包,基于同名的 JavaScript,plotly.js。 Plotly 包有助于创建交互式和直观的绘图和图形。它还提供了将这些图表嵌入网页并将它们保存在您的计算机上的能力。它与 ggplot 包一起被广泛使用,以制作复杂、复杂和有吸引力的数据可视化。

Plotly 提供了一个名为 ggplotly 的包,它有助于将 ggplot 图表和绘图转换为交互式绘图和图形。

设置好 R 和 RStudio 后,我们需要在 Rstudio 中安装以下软件包。

  • 情节
  • ggplot
  • Dplyr
  • 宝贝名字
  • 间隙器

要安装这些软件包,我们使用以下命令:

R
install.packages("plotly")
install.packages("ggplot2")
install.packages("dplyr")
install.packages("car")
install.packages("babynames")
install.packages("gapminder")


R
library(plotly)
library(dplyr)
library(carData)
library(gapminder)
library(babynames)


R
p <- ggplot(data=iris, aes(Petal.Length,Sepal.Length)) +
geom_point(aes(color=Species)) + 
ggtitle("Petal Length vs Sepal Length")


R
ggplotly(p)


R
p1 <- ggplot(data=cars, aes(dist,speed)) + geom_point() +
ggtitle("Stopping Distance vs Speed") +
xlab("Stopping Distance in feet") +
ylab("Speed (mph)")


R
ggplotly(p1)


R
p2 <- ggplot(mpg, aes(manufacturer)) + geom_bar(aes(fill = drv))+
ggtitle("Distribution for Cars based on Drive Type and Manufacturers")


R
ggplotly(p2)


R
babyData<-babynames %>% filter(name %in% c(
  'Florence','Harriette','Emma','Bertha','Chloe','Sarah'))%>% filter(sex=='F')
 
p2<- ggplot(babyData, aes(x=year, y=n, fill=name,
                          text=name))+ geom_area()+
ggtitle('Yearwise popularity of american baby names')


R
ggplotly(p2)


R
airQuality_plot <- ggplot(airquality, aes(x = Day, y = Ozone,
                                          color= as.factor(Month),
                                          text = paste("Month:", Month))) +
       geom_point(size = airquality$Wind) +
       ggtitle("Air Quality in New York by Day") +
       labs(x = "Day of the month", y = "Ozone (ppb)", color="Month") +
       scale_x_continuous(breaks = seq(1, 31, 5))+
       scale_size(range = c(1, 10))


R
ggplotly(airQuality_plot, tooltip=c("text","x","y"))


R
p <- ggplot(txhousing, aes(month, median)) +
   geom_line(aes(group = year), alpha = 0.3) +
   geom_smooth() +
   geom_line(aes(frame = year, ids = month), color = "red") +
   facet_wrap(~ city)


R
ggplotly(p, width = 1500, height = 900) %>%
animation_opts(1000)


R
accumulate_by <- function(dat, var) {
 var <- lazyeval::f_eval(var, dat)
 lvls <- plotly:::getLevels(var)
 dats <- lapply(seq_along(lvls), function(x) {
   cbind(dat[var %in% lvls[seq(1, x)], ], frame = lvls[[x]])
 })
 dplyr::bind_rows(dats)
}
 
df <- txhousing 
plot_data <- df %>%
 filter(year > 2010)
plot <- plot_data %>% accumulate_by(~date)


R
ggplot(fig, aes(date,median)) + geom_line(aes(group=city,color=city))


R
plot <- plot %>%
 ggplotly(x = ~date, y = ~median,
   split = ~city,
   frame = ~frame, 
   type = 'scatter',
   mode = 'lines', 
   line = list(simplify = F)
 )
plot <- plot %>% layout(
 xaxis = list(
   title = "Date",
   zeroline = F
 ),
 yaxis = list(
   title = "Median",
   zeroline = F
 )
) 
plot <- plot %>% animation_opts(
 frame = 100, 
 transition = 0, 
 redraw = FALSE
)
plot <- plot %>% animation_slider(
 hide = T
)
plot <- plot %>% animation_button(
 x = 1, xanchor = "right", y = 0, yanchor = "bottom"
)


我们还需要在 RStudio 会话中加载它们,如下所示:

R

library(plotly)
library(dplyr)
library(carData)
library(gapminder)
library(babynames)

现在我们已经在 RStudio 中安装并加载了所有必需的包,我们将查看一些使用不同绘图的示例。

散点图

散点图通常显示两个数值变量之间的关系。每个点代表水平和垂直轴上的一个值。要生成散点图,我们将使用 R 中的 iris 数据集。要使用 ggplot 生成散点图,我们使用geom_point函数。

R

p <- ggplot(data=iris, aes(Petal.Length,Sepal.Length)) +
geom_point(aes(color=Species)) + 
ggtitle("Petal Length vs Sepal Length")

但是,情节不是交互式的。我们使用 ggplotly函数使其具有交互性,并将绘图作为参数传递给函数。 Ggplotly 提供了放大、缩小、套索选择等选项。

R

ggplotly(p)

另一个例子是汽车数据集中的距离与速度散点图。

R

p1 <- ggplot(data=cars, aes(dist,speed)) + geom_point() +
ggtitle("Stopping Distance vs Speed") +
xlab("Stopping Distance in feet") +
ylab("Speed (mph)")

为了使其具有交互性,我们使用以下代码

R

ggplotly(p1)

条状图

条形图也称为条形图,垂直或水平绘制分类数据。要使用“mpg”数据集创建非交互式条形图,我们使用geom_bar函数。

R

p2 <- ggplot(mpg, aes(manufacturer)) + geom_bar(aes(fill = drv))+
ggtitle("Distribution for Cars based on Drive Type and Manufacturers")

要使用 ggplotly 使相同的图形交互,我们这样做:

R

ggplotly(p2)

面积图

面积图或面积图是折线图的延伸。面积图是填充了下方面积的折线图。为了绘制面积图,我们将使用 babynames 数据集。

我们仅从数据集中过滤了最少数量的名称以进行可视化。我们使用 geom_area函数创建面积图。

R

babyData<-babynames %>% filter(name %in% c(
  'Florence','Harriette','Emma','Bertha','Chloe','Sarah'))%>% filter(sex=='F')
 
p2<- ggplot(babyData, aes(x=year, y=n, fill=name,
                          text=name))+ geom_area()+
ggtitle('Yearwise popularity of american baby names')

为了使上述图表具有交互性,我们使用 ggplotly函数如下:

R

ggplotly(p2)

气泡图

气泡图是散点图的扩展。气泡图是数据的三维可视化表示,其中两个轴定义点,而第三个维度表示气泡的大小。

我们将使用 R 中的空气质量数据集创建一个气泡图。我们使用 geom_point() 创建一个气泡图,将大小添加为第三个维度。

R

airQuality_plot <- ggplot(airquality, aes(x = Day, y = Ozone,
                                          color= as.factor(Month),
                                          text = paste("Month:", Month))) +
       geom_point(size = airquality$Wind) +
       ggtitle("Air Quality in New York by Day") +
       labs(x = "Day of the month", y = "Ozone (ppb)", color="Month") +
       scale_x_continuous(breaks = seq(1, 31, 5))+
       scale_size(range = c(1, 10))

但是,气泡图在交互时更具洞察力。工具提示是指定我们要在绘图上显示的具体信息。

R

ggplotly(airQuality_plot, tooltip=c("text","x","y"))

动画图

有时即使使用交互式图表,图片也不完整。向复杂图形添加运动有助于使变量之间的关系更加透明,并为图形添加更多含义。为此,我们使用动画。

使用 ggplotly 包,我们可以添加范围滑块、动画帧、按钮等动画,这些动画显示了运动中变量之间的关系。动画通常适用于显示随时间变化的趋势的数据。为了演示动画示例,我们将使用 txhousing 数据集。在使用 txhousing 数据集的第一个示例中,我们将绘制一个简单的图表,显示每个城市多年来的每月房价中位数。年份的中值标记为红线。该图的非交互式版本仅使用 ggplot 如下;

R

p <- ggplot(txhousing, aes(month, median)) +
   geom_line(aes(group = year), alpha = 0.3) +
   geom_smooth() +
   geom_line(aes(frame = year, ids = month), color = "red") +
   facet_wrap(~ city)

使用animation_opts函数,我们可以逐年展示中线的移动。我们还可以放大看部分数据如下:

R

ggplotly(p, width = 1500, height = 900) %>%
animation_opts(1000)

我们还可以显示每个城市的房价中值的逐年增长情况。为此,我们首先需要对数据集进行变异,以获得每个城市一年的房屋价值中位数。

R

accumulate_by <- function(dat, var) {
 var <- lazyeval::f_eval(var, dat)
 lvls <- plotly:::getLevels(var)
 dats <- lapply(seq_along(lvls), function(x) {
   cbind(dat[var %in% lvls[seq(1, x)], ], frame = lvls[[x]])
 })
 dplyr::bind_rows(dats)
}
 
df <- txhousing 
plot_data <- df %>%
 filter(year > 2010)
plot <- plot_data %>% accumulate_by(~date)

然后我们可以使用 ggplot 绘制这些数据,如下所示:

R

ggplot(fig, aes(date,median)) + geom_line(aes(group=city,color=city))

上面的代码输出图形的非交互式版本。要对此进行动画处理,我们可以使用以下代码:

R

plot <- plot %>%
 ggplotly(x = ~date, y = ~median,
   split = ~city,
   frame = ~frame, 
   type = 'scatter',
   mode = 'lines', 
   line = list(simplify = F)
 )
plot <- plot %>% layout(
 xaxis = list(
   title = "Date",
   zeroline = F
 ),
 yaxis = list(
   title = "Median",
   zeroline = F
 )
) 
plot <- plot %>% animation_opts(
 frame = 100, 
 transition = 0, 
 redraw = FALSE
)
plot <- plot %>% animation_slider(
 hide = T
)
plot <- plot %>% animation_button(
 x = 1, xanchor = "right", y = 0, yanchor = "bottom"
)

输出: