当用户在我的RShiny应用程序中输入特定数据时,我尝试创建ggplot 2区域图。我将空间数据框与数据合并,如下所示,我认为工作正常:
# inputting data in RShiny app:
output$contents <- renderTable({
file <- input$uploaded_data
ext <- tools::file_ext(file$datapath)
req(file)
counties_and_trash <- read_csv(file$datapath)
mean_each_type <- counties_and_trash %>%
group_by(COUNTY) %>%
summarise(mean_plastics = mean(PLASTICS, na.rm = TRUE),
mean_papers = mean(PAPERS, na.rm = TRUE),
mean_metals = mean(METALS, na.rm = TRUE))
})
# merging spdf and data:
spdf <- geojson_read('County_Boundaries_of_NJ.geojson', what = "sp")
merged <- merge(spdf, mean_each_type, by.x = 'COUNTY', by.y = 'mean_plastics')
请注意,到目前为止,我只尝试在区域分布图中绘制“mean_plastics”。其他的(“mean_papers”和“mean_metals”)目前无关紧要。我尝试在RShiny应用程序中输出ggplot 2区域分布图,如下所示:
output$plot <- renderPlot({
ggplot(merged, aes(x = x, y = y)) +
geom_polygon(aes(fill = mean_plastics), data = mean_each_type, x = 'COUNTY', y = 'mean_plastics') +
theme_void() +
coord_map()
})
当我尝试输出它时,我得到了以下错误:
Warning: Error in geom_polygon: Problem while converting geom to grob.
ℹ Error occurred in the 1st layer.
Caused by error in `lat * pi`:
! non-numeric argument to binary operator
我确信“output$plot...”代码块有问题,但我不知道如何修复它。
如果需要更多的信息,我可以提供。如果我解释得不够好,我道歉,这是我第一次做一个更复杂的R项目。谢谢你的帮助!
编辑:我在下面添加了可重复性最低的示例。
要使代码工作,您必须下载的唯一文件位于以下链接(下载的文件应具有名称“County_Boundaries_of_NJ.geojson”):
download link for NJ county boundaries geojson
下面是最小的可重复代码:
library(shiny)
library(tidyverse)
library(ggplot2)
library(geojsonio)
library(broom)
library(sp)
library(sf)
ui <- fluidPage(
fluidRow(
h1(strong('NJ Beachsweep Mapping with R'), align = 'center'),
column(6,
# this empty column is just to put the other column in the right place
),
column(6,
tableOutput("contents")
),
mainPanel(
plotOutput("plot")
)
)
)
server <- function(input, output, session) {
counties_and_trash <- structure(list(COUNTY = c("Atlantic", "Atlantic", "Bergen", "Burlington",
"Burlington", "Essex", "Middlesex", "Cape May", "Cape May", "Cape May",
"Monmouth", "Monmouth", "Monmouth", "Monmouth", "Monmouth", "Monmouth",
"Ocean"), PLASTICS = c(340, 300, 325, 467, 545, 354, 433, 325,
324, 653, 768, 457, 486, 944, 356, 457, 568), PAPERS = c(260,
210, 453, 223, 235, 356, 324, 274, 540, 346, 475, 462, 342, 354,
435, 346, 234), METALS = c(45, 35, 123, 124, 224, 124, 134, 342,
230, 243, 324, 125, 323, 122, 334, 421, 401)), row.names = c(NA,
-17L), spec = structure(list(cols = list(COUNTY = structure(list(), class = c("collector_character",
"collector")), PLASTICS = structure(list(), class = c("collector_double",
"collector")), PAPERS = structure(list(), class = c("collector_double",
"collector")), METALS = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), delim = ","), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
mean_each_type <- counties_and_trash %>%
group_by(COUNTY) %>%
summarise(mean_plastics = mean(PLASTICS, na.rm = TRUE),
mean_papers = mean(PAPERS, na.rm = TRUE),
mean_metals = mean(METALS, na.rm = TRUE))
output$contents <- renderTable({
counties_and_trash
})
spdf <- geojson_read('County_Boundaries_of_NJ.geojson', what = "sp")
merged <- merge(spdf, mean_each_type, by.x = 'COUNTY', by.y = 'mean_plastics')
output$plot <- renderPlot({ # this block of code is where the issue most likely is
ggplot(merged, aes(x = x, y = y)) +
geom_polygon(aes(fill = mean_plastics)) +
theme_void() +
coord_map()
})
}
shinyApp(ui = ui, server = server)
太感谢你了!
1条答案
按热度按时间db2dz4w81#
您的代码存在多个问题,但没有一个与shiny相关。首先,您读取的shapefile是
sp
对象。对于这种类型的对象,简单地合并数据或通过geom_polygon
绘图都不起作用。而是转换为sf
对象,该对象的行为与标准 Dataframe 相当相同,并且可以使用geom_sf
轻松绘图。其次,在mean_plastics
上进行合并是没有意义的,因为在空间数据集中没有这样的列。第三,只有当两个数据集中有相同的键而不仅仅是相同的列名时,合并才起作用,也就是说,您必须在mean_each_type
数据集中将COUNTY
列转换为大写形式。