R: gganimate 与 geom_density
R: gganimate with geom_density
我正在尝试使用 gganimate
创建动画图表。我的默认图表,静态是这样的:
但是我有 12 个(第 0 年、第 1 年、第 2 年等)而不是 3 个分组变量。我不想将所有 12 个变量一起绘制,而是想对其进行动画处理。避免:
这些内核密度图制作如下:
data_decidious %>% tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%
mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>% mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>% mutate(YEAR = as.factor(YEAR)) %>%
ggplot(aes(NDVI,fill=YEAR)) + geom_density(alpha=.2) + xlim(0.3, 0.7) + ylim(0,46) +
xlab("Mean NDVI") + ylab("Kernal density") + guides(fill=guide_legend(title="Comparative"))
我发现这个 geom_density()
只有在我添加 mutate(YEAR = as.factor(YEAR))
时才有效。这意味着当我添加:
transition_time(YEAR) + ease_aes('linear')
我收到错误:
Error: time data must either be integer, numeric, POSIXct, Date, difftime, orhms
In addition: Warning message:
In min(cl[cl != 0]) : no non-missing arguments to min; returning Inf
有什么想法可以为我的图表制作动画吗?
不需要将 YEAR
转换为因数。而是简单地将 factor(YEAR)
映射到 fill
。这样你就可以在过渡时间使用YEAR
,一切都很好。
使用 gapminder::gapminder
数据集作为示例数据,以下代码绘制了全球预期寿命密度随时间变化的动画。
(顺便说一句:您可以直接在 fill
上映射 YEAR
以获得连续色标,而不是使用分类色标。但是,在这种情况下,您必须映射 YEAR
也谈 group
审美):
library(ggplot2)
library(dplyr)
library(gganimate)
p <- gapminder::gapminder %>%
ggplot(aes(lifeExp, fill = factor(year))) +
geom_density(alpha=.2) +
xlab("Life Expectancy") +
ylab("Kernal density") +
guides(fill = guide_legend(title = "Year"))
p +
transition_time(year) +
ease_aes('linear')
由 reprex package (v0.3.0)
于 2020-04-17 创建
编辑:
据我所知,在没有看到你的数据集的情况下,你必须像这样调整你的代码(通过检查你的代码,我猜 YEAR
是一个字符。所以你必须将它转换为整数):
data_long <- data_decidious %>%
tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%
mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>%
mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>%
# Convert YEAR to integer
mutate(YEAR = as.integer(YEAR))
p <- data_long %>%
ggplot(aes(NDVI,fill=factor(YEAR))) +
geom_density(alpha=.2) +
xlim(0.3, 0.7) +
ylim(0,46) +
xlab("Mean NDVI") +
ylab("Kernal density") +
guides(fill=guide_legend(title="Comparative"))
p +
transition_time(YEAR) +
ease_aes('linear')
anim_save("test.gif")
我正在尝试使用 gganimate
创建动画图表。我的默认图表,静态是这样的:
但是我有 12 个(第 0 年、第 1 年、第 2 年等)而不是 3 个分组变量。我不想将所有 12 个变量一起绘制,而是想对其进行动画处理。避免:
这些内核密度图制作如下:
data_decidious %>% tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%
mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>% mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>% mutate(YEAR = as.factor(YEAR)) %>%
ggplot(aes(NDVI,fill=YEAR)) + geom_density(alpha=.2) + xlim(0.3, 0.7) + ylim(0,46) +
xlab("Mean NDVI") + ylab("Kernal density") + guides(fill=guide_legend(title="Comparative"))
我发现这个 geom_density()
只有在我添加 mutate(YEAR = as.factor(YEAR))
时才有效。这意味着当我添加:
transition_time(YEAR) + ease_aes('linear')
我收到错误:
Error: time data must either be integer, numeric, POSIXct, Date, difftime, orhms
In addition: Warning message:
In min(cl[cl != 0]) : no non-missing arguments to min; returning Inf
有什么想法可以为我的图表制作动画吗?
不需要将 YEAR
转换为因数。而是简单地将 factor(YEAR)
映射到 fill
。这样你就可以在过渡时间使用YEAR
,一切都很好。
使用 gapminder::gapminder
数据集作为示例数据,以下代码绘制了全球预期寿命密度随时间变化的动画。
(顺便说一句:您可以直接在 fill
上映射 YEAR
以获得连续色标,而不是使用分类色标。但是,在这种情况下,您必须映射 YEAR
也谈 group
审美):
library(ggplot2)
library(dplyr)
library(gganimate)
p <- gapminder::gapminder %>%
ggplot(aes(lifeExp, fill = factor(year))) +
geom_density(alpha=.2) +
xlab("Life Expectancy") +
ylab("Kernal density") +
guides(fill = guide_legend(title = "Year"))
p +
transition_time(year) +
ease_aes('linear')
由 reprex package (v0.3.0)
于 2020-04-17 创建编辑:
据我所知,在没有看到你的数据集的情况下,你必须像这样调整你的代码(通过检查你的代码,我猜 YEAR
是一个字符。所以你必须将它转换为整数):
data_long <- data_decidious %>%
tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%
mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>%
mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>%
# Convert YEAR to integer
mutate(YEAR = as.integer(YEAR))
p <- data_long %>%
ggplot(aes(NDVI,fill=factor(YEAR))) +
geom_density(alpha=.2) +
xlim(0.3, 0.7) +
ylim(0,46) +
xlab("Mean NDVI") +
ylab("Kernal density") +
guides(fill=guide_legend(title="Comparative"))
p +
transition_time(YEAR) +
ease_aes('linear')
anim_save("test.gif")