为啥将图例添加到绘图时会出现错误?

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_infoshp$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) 不完美但很有效。

以上是关于为啥将图例添加到绘图时会出现错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在绘图本身中添加 Matlab 中的图例元素

我们可以将函数“文本”的图例添加到 matlab 吗?

TypeError:将第二个图例添加到绘图时,“PathCollection”对象不可迭代

Matplotlib 绘图:删除轴、图例和空白

将图例添加到 Axes3D 图

将图例添加到多元线性回归图的单个图