R语言 用Plotly创建交互式ggplot2图形
“一图胜千言”,如果用户能与之互动,这幅图就更有表现力了。因此,有了 “交互式图表 “的概念。交互式图表让演示者和听众都有更多的自由,因为它们允许用户放大和缩小,悬停和阅读与标记有关的信息,获得工具提示信息等。R提供了很多制作交互式图表的软件包。在这篇文章中,我们将重点介绍 plotly 和 ggplot。
Ggplot 是Tidyverse在R中的一个包。它基于Leland Wilkinson的Grammar of Graphics。ggplot使用Grammar of Graphics中列出的原则创建了复杂而繁琐的图。用户可以使用所有类型的数据,如单变量、多变量或分类数据,来创建数据。它是作为R中基本图形包的替代品,现在是R中最流行的数据可视化包之一。
然而,ggplot不能制作交互式图表。为了帮助ggplot创建交互式绘图,我们可以使用一个叫做plotly的包。
Plotly 是R语言中的一个开源包,它是基于同名的JavaScript,即plotly.js。Plotly包有助于创建交互式的、直观的绘图和图表。它还提供了将这些图形嵌入网页并保存在电脑上的能力。它与ggplot包一起被广泛用于制作复杂、错综复杂和有吸引力的数据可视化。
Plotly提供了一个名为ggplotly的包,它有助于将ggplot图表和图画转换为交互式图画和图形。
一旦R和RStudio设置好了,我们需要在Rstudio中安装以下软件包。
- Plotly
- Ggplot
- Dplyr
- car
- babynames
- Gapminder
为了安装这些软件包,我们使用以下命令。
install.packages("plotly")
install.packages("ggplot2")
install.packages("dplyr")
install.packages("car")
install.packages("babynames")
install.packages("gapminder")
我们还需要在RStudio会话中加载它们,如下所示。
library(plotly)
library(dplyr)
library(carData)
library(gapminder)
library(babynames)
现在我们已经在RStudio中安装并加载了所有需要的包,我们将使用不同的图来看看一些例子。
散点图
散点图通常显示两个数字变量之间的关系。每个点代表横轴和纵轴上的一个值。为了生成散点图,我们将使用R中的虹膜数据集。为了使用ggplot生成散点图,我们使用 geom_point 函数。
p <- ggplot(data=iris, aes(Petal.Length,Sepal.Length)) +
geom_point(aes(color=Species)) +
ggtitle("Petal Length vs Sepal Length")
然而,该图不是互动的。我们使用ggplotly函数来使其具有交互性,并将绘图作为一个参数传递给该函数。Ggplotly提供了诸如放大、缩小、套索选择等选项。
ggplotly(p)
另一个例子是汽车数据集中的距离与速度的散点图。
p1 <- ggplot(data=cars, aes(dist,speed)) + geom_point() +
ggtitle("Stopping Distance vs Speed") +
xlab("Stopping Distance in feet") +
ylab("Speed (mph)")
为了使其具有互动性,我们使用以下代码
ggplotly(p1)
条形图
条形图也被称为条形图,以垂直或水平方式绘制分类数据。为了使用 “mpg “数据集创建一个非交互式条形图,我们使用 geom_bar 函数。
p2 <- ggplot(mpg, aes(manufacturer)) + geom_bar(aes(fill = drv))+
ggtitle("Distribution for Cars based on Drive Type and Manufacturers")
为了使同样的图形用ggplotly进行互动,我们这样做。
ggplotly(p2)
面积图
面积图或面积图是直线图的延伸。面积图是填入其下面积的线图。为了绘制一个区域图,我们将使用babynames数据集。
我们只从数据集中过滤了最低数量的名字用于我们的可视化。我们使用geom_area函数创建面积图。
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函数,如下所示。
ggplotly(p2)
泡沫图
泡沫图是散点图的延伸。泡泡图是你的数据的三维视觉表示,其中两个轴定义了点,而第三个维度代表了泡泡的大小。
我们将使用R中的空气质量数据集创建一个气泡图。我们使用geom_point()创建一个气泡图,将大小作为第三维添加。
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))
然而,当气泡图是互动的时候,它就更有洞察力了。工具提示是为了指定我们要在图上显示的具体信息。
ggplotly(airQuality_plot, tooltip=c("text","x","y"))
动画图表
有时,即使是交互式图表,画面也是不完整的。为复杂的图表添加动作可以帮助使变量之间的关系更加透明,并为图表添加更多的意义。为了达到这个目的,我们使用动画。
使用ggplotly包,我们可以添加动画,如范围滑块、动画帧、按钮等,在运动中显示变量之间的关系。动画通常对显示随时间变化的趋势的数据很有效。为了演示一个动画例子,我们将使用txhousing数据集。在第一个使用txhousing数据集的例子中,我们将画一个简单的图,显示每个城市多年来每月的房价中值。该年的中值被标记为一条红线。该图的非交互式版本仅使用ggplot,如下所示。
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函数,我们可以逐年显示中位线的移动。我们还可以放大并看到一部分数据,如下所示。
ggplotly(p, width = 1500, height = 900) %>%
animation_opts(1000)
我们还可以显示每个城市的住房价值中位数的逐年增长。 要做到这一点,我们首先需要对数据集进行变异,以获得每个城市一年的住房价值中值。
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对这些数据进行绘制,如下所示。
ggplot(fig, aes(date,median)) + geom_line(aes(group=city,color=city))
上面的代码输出了一个非交互式的图形版本。为了使之成为动画,我们可以使用以下代码。
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"
)
输出