向连续刻度提供离散值报错:管道流速等高图绘制问题
解决“向连续刻度提供离散值”错误的管道流速等高图绘制方案
错误根源
Flow和Area列被存储为字符类型,而ggplot2的scale_x_continuous/scale_y_continuous要求轴变量为连续数值型。即便你尝试过转换数值,可能是转换时机或方式存在疏漏。
修正方案
方案1:修复现有代码的数据类型
在创建U数据框后,显式将字符型的Flow和Area转为数值型:
cat("\014") graphics.off() library(rayshader) library(ggplot2) library(tidyverse) library(gapminder) n= 8 dm<- 300/1000 #max diameter (mm) am<- (dm^2*pi)/4 #ergo max area (m^2) qm<- 800/3600 #max flow rate (m^3/h) i<- am/n ii<- qm/(am/i) A<- seq(from = (0+i), to = am, by = i) Q<- seq(from = (0+ii),to = qm, by = ii) u<- sapply(Q,'/',A) uu<- u colnames(uu) = c(A) rownames(uu) = c(Q) # 新增数值转换步骤 U<- as.data.frame(uu) %>% rownames_to_column(var = "Flow") %>% pivot_longer(col = -c(Flow),names_to = "Area", values_to = "Velocity") %>% mutate(Flow = as.numeric(Flow), Area = as.numeric(Area)) g2<- U %>% ggplot(aes(x=Flow, y=Area, fill=Velocity))+ geom_tile()+ geom_contour(aes(z=Velocity),colour="black")+ scale_x_continuous("Flow", expand=c(0,0))+ scale_y_continuous("Area", expand=c(0,0))+ scale_fill_gradientn("Velocity",colours=terrain.colors(10))+ coord_fixed() #rayshader g2 %>% plot_gg( multicore = TRUE, raytrace = TRUE, width = 7, height = 4, scale = 300, windowsize = c(1400,866), zoom = 0.6, phi = 30, theta = 30 )
方案2:更简洁的数据生成方式(推荐)
直接用expand.grid生成所有流量和面积的组合,从根源避免字符型变量问题:
cat("\014") graphics.off() library(rayshader) library(ggplot2) library(tidyverse) library(gapminder) n= 8 dm<- 300/1000 #max diameter (mm) am<- (dm^2*pi)/4 #ergo max area (m^2) qm<- 800/3600 #max flow rate (m^3/h) i<- am/n ii<- qm/(am/i) A<- seq(from = (0+i), to = am, by = i) Q<- seq(from = (0+ii),to = qm, by = ii) # 直接生成数值型的组合数据框 U <- expand.grid(Flow = Q, Area = A) %>% mutate(Velocity = Flow / Area) g2<- U %>% ggplot(aes(x=Flow, y=Area, fill=Velocity))+ geom_tile()+ geom_contour(aes(z=Velocity),colour="black")+ scale_x_continuous("Flow", expand=c(0,0))+ scale_y_continuous("Area", expand=c(0,0))+ scale_fill_gradientn("Velocity",colours=terrain.colors(10))+ coord_fixed() #rayshader g2 %>% plot_gg( multicore = TRUE, raytrace = TRUE, width = 7, height = 4, scale = 300, windowsize = c(1400,866), zoom = 0.6, phi = 30, theta = 30 )
说明
方案2中expand.grid生成的Flow和Area本身就是数值型,无需额外转换,代码更简洁且不易出错。两种方案都能解决“向连续刻度提供离散值”的错误,正常生成等高图和3D可视化。
内容的提问来源于stack exchange,提问作者Joe Bennet
相关产品推荐
相关产品推荐

