使用rayshader渲染ggplot图时出现hillshade数组不兼容错误的解决
问题:使用rayshader运行
plot_gg时出现数组不匹配错误 错误信息
Error in hillshade[, , 1] * scales::rescale(shadowmap, c(max_darken, 1)) : non-conformable arrays
运行代码
library(tidyverse) library(reshape2) library(viridis) library(rayshader) measles = read_csv("https://tylermw.com/data/measles_country_2011_2019.csv") melt_measles = reshape2::melt(measles, id.vars = c("Year", "Country", "Region", "ISO3")) melt_measles$Month = melt_measles$variable melt_measles$cases = melt_measles$value # Plot melt_measles %>% group_by(Year, Month) %>% summarize(totalcases = sum(cases,na.rm = TRUE)) %>% mutate(totalcases = ifelse(Year == 2019 & !(Month %in% c("January","February","March")), NA, totalcases)) %>% ggplot() + geom_tile(aes(x=Year, y=Month, fill=totalcases,color=totalcases),size=1,color="black") + scale_x_continuous("Year", expand=c(0,0), breaks = seq(2011,2019,1)) + scale_y_discrete("Month", expand=c(0,0)) + scale_fill_viridis("Total\nCases") + ggtitle("Reported Worldwide Measles Cases") + labs(caption = "Data Source: WHO") + theme(axis.text = element_text(size = 12), title = element_text(size = 12,face="bold"), panel.border= element_rect(size=2,color="black",fill=NA)) -> measles_gg plot_gg(measles_gg, multicore = TRUE, width = 6, height = 5.5, scale = 300, background = "#afceff",shadowcolor = "#3a4f70")
错误成因
这个错误出现在rayshader的阴影计算环节,核心原因是ggplot生成的可视化里存在NA值(2019年4-12月的病例数被设为NA)。这些NA值导致提取的高度矩阵(hillshade)和阴影矩阵(shadowmap)维度不匹配——NA对应的区域没有生成有效高度数据,使得两个数组无法执行逐元素乘法运算,从而抛出数组不匹配的错误。
修复方法
有两种简单的修复方式:
方式1:替换NA值为0
把代码中处理2019年非前三月数据的mutate语句里的NA替换为0,确保所有单元格都有有效数值:
mutate(totalcases = ifelse(Year == 2019 & !(Month %in% c("January","February","March")), 0, totalcases))
方式2:让rayshader忽略NA值
在plot_gg函数中添加na.rm = TRUE参数,让rayshader自动忽略NA对应的区域,避免矩阵维度不匹配:
plot_gg(measles_gg, multicore = TRUE, width = 6, height = 5.5, scale = 300, background = "#afceff", shadowcolor = "#3a4f70", na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

