为啥将图例添加到绘图时会出现错误?
Posted
技术标签:
【中文标题】为啥将图例添加到绘图时会出现错误?【英文标题】:Why do the error occurs adding legend to plot?为什么将图例添加到绘图时会出现错误? 【发布时间】:2020-10-03 18:22:38 【问题描述】:我正在尝试使用下面的代码将图例添加到我的分类图中。
library(raster)
library(RStoolbox)
landsat5 <- stack('lt05.tif')
shp<-shapefile("to5/to.shp")
SC_rf <- superClass(landsat5, shp, responseCol = "MC_ID",
nSamples = 1000, polygonBasedCV = TRUE,
model = "rf", tuneLength = 5, kfold = 5,
mode = "classification", predType = "raw", overwrite = TRUE)
## Plots
colors <- c("yellow", "green", "deeppink", "orange", "red")
plot(SC_rf$map, col = colors, legend = TRUE, axes = FALSE, box = FALSE)
legend(1, 1, legend = levels(shp$MC_info), fill = colors , title = "Classes")
地图已创建,但出现图例错误:
'legend(1, 1, legend = levels(shp$MC_info), fill = colors, title = "Classes")': 'legend' 的长度为 0
这是我的 shp 对象:
【问题讨论】:
shp$data$MC_info
?
没有帮助,仍然报同样的错误
是的,在这两种情况下,'legend' 的长度都是 0
从图片来看,shp
没有名为MC_info
的单元格。 MC_info
在shp$data
中。 shp$MC_info
会返回任何东西吗?它的类是什么?
shp$MC_info
不再显示错误但仍不显示图例。并且 shp 有 SpatialPolygonsDataFrame 类
【参考方案1】:
MC_info
似乎是一个向量,而不是一个因子,所以你不需要使用levels()
。要访问 shapefile 对象中的数据,请尝试通过 raster
包中的 as.data.frame()
函数对其进行转换:
legend(1, 1, legend = raster::as.data.frame(shp)$MC_info, fill = colors , title = "Classes")
或者您可以为此定义一个变量:
shp_df <- raster::as.data.frame(shp)
legend(1, 1, legend = shp_df$MC_info, fill = colors , title = "Classes")
这对我有用,因为它从shp
对象转换data
数据框,并且MC_Info
列很容易访问。但是我没有您的数据来检查您需要的图例是否正常工作...
【讨论】:
它不再显示错误,但仍然不显示来自 MC_info 的名称,而只显示来自 MC_ID 的数字 1-5... @Aisyram 我对空间多边形不太熟悉,但是您可以尝试像plot(..., legend = FALSE)
一样抑制plot()
中的默认图例以让legend() 生效?请参阅底部的here。让我知道这是否有效...
@Aisyram 嗨,我尝试使用 shapefile 对象,在我看来,要访问其数据,您需要使用 raster
包中的 as.data.frame()
函数。我已经更新了答案,请试试这个,然后告诉我。
还是一样...但我找到了另一个解决方案:par(xpd = FALSE, mar=c(1, 1, 1, 1)) plot(SC_knn$map, col=colors, breaks=brk, main="K-Nearest Neighbors Classification", legend = FALSE, axes = FALSE, box = FALSE) par(xpd = TRUE) legend( "right", legend = c("Woda", "Zabudowa miejska", "Roślinność niska","Grunty", "Drzewa"), fill = rev(colors), inset = -0.5, cex = 0.8, title = "Klasy:",title.adj = 0.1)
不完美但很有效。以上是关于为啥将图例添加到绘图时会出现错误?的主要内容,如果未能解决你的问题,请参考以下文章