ggplot中axis.text的face='bold'不生效且axis.line仅控制左下轴线
解决ggplot绘制栅格图的两个样式问题
问题描述
- 设置
axis.text的face='bold'后,坐标轴文本并未变为粗体; axis.line仅能控制左侧和底部的轴线,顶部和右侧轴线单独设置仍显示异常。
使用rasterVis的gplot()结合coord_sf()绘图时遇到上述问题,尝试tidyterra包后问题依旧,原代码如下:
library(terra) library(raster) library(rasterVis) f <- system.file("external/test.grd", package="raster") r <- rast(f) rr <- project(x=r,y='epsg:4326') rr gplot(rr)+ geom_raster(aes(fill = value),na.rm=T)+ scale_fill_distiller(na.value = NA)+ ggtitle(label = 'Test')+ coord_sf(crs=4326)+ theme(axis.title = element_blank(), axis.line = element_line(colour='black', linewidth = 3, linetype=1), axis.line.x.top = element_line(colour='black', linewidth = 1, linetype=1), axis.line.y.right = element_line(colour='black', linewidth = 1, linetype=1), plot.title = element_text(hjust = 0.5,size = 20, face = 'bold',family = 'serif'), axis.text = element_text(size=20,face='bold', family = 'serif',color = 'black'), legend.title=element_text(face='bold',family = 'serif', size = 15), legend.text = element_text(size = 15, face='bold', family='serif'), panel.background = element_rect(fill=NA,color = 'black') )
原因分析
使用coord_sf()后,ggplot会启用针对地理坐标系的特殊主题元素,常规的axis.text、axis.line等参数会被axis.text.sf、axis.line.sf及对应方位的参数覆盖,导致常规设置不生效。
解决方案
修改theme()中的对应参数,替换为sf专属的主题元素:
- 坐标轴文本粗体:用
axis.text.sf替代axis.text,同时可单独设置上下左右的文本样式; - 四条轴线控制:分别设置
axis.line.x.top.sf、axis.line.x.bottom.sf、axis.line.y.left.sf、axis.line.y.right.sf来指定每条轴线的样式。
修改后的代码如下:
library(terra) library(raster) library(rasterVis) f <- system.file("external/test.grd", package="raster") r <- rast(f) rr <- project(x=r,y='epsg:4326') gplot(rr)+ geom_raster(aes(fill = value), na.rm = TRUE)+ scale_fill_distiller(na.value = NA)+ ggtitle(label = 'Test')+ coord_sf(crs = 4326)+ theme( axis.title = element_blank(), # 单独设置四条轴线的样式 axis.line.x.bottom.sf = element_line(colour='black', linewidth = 3, linetype=1), axis.line.x.top.sf = element_line(colour='black', linewidth = 1, linetype=1), axis.line.y.left.sf = element_line(colour='black', linewidth = 3, linetype=1), axis.line.y.right.sf = element_line(colour='black', linewidth = 1, linetype=1), plot.title = element_text(hjust = 0.5, size = 20, face = 'bold', family = 'serif'), # 设置sf坐标轴文本为粗体 axis.text.sf = element_text(size=20, face='bold', family = 'serif', color = 'black'), legend.title=element_text(face='bold', family = 'serif', size = 15), legend.text = element_text(size = 15, face='bold', family='serif'), panel.background = element_rect(fill=NA, color = 'black') )
补充说明
如果需要更精细控制某一侧的坐标轴文本,可单独使用axis.text.x.top.sf、axis.text.x.bottom.sf、axis.text.y.left.sf、axis.text.y.right.sf来设置对应方位的文本样式。
内容的提问来源于stack exchange,提问作者jackywang
相关产品推荐
相关产品推荐

