目标是在Shiny中创建一个交互式(单个)图,用户可以在其中选择数据框的任何所需变量。现在,将绘制变量freq_prov_tot。该图本身正在运行,但是我不知道如何包括其他变量以交互方式从中“选择”。还包括一个工具提示。我之所以使用ggiraph,是因为可以很容易地将此交互式多边形地图集成到Shiny中。
如果您知道如何解决此问题,将非常感谢您的帮助。
我正在使用的数据框如下。为了保护使用的数据,所有省份将变量freq_prov_tot的值设置为1。
3
工具提示的代码
elseif
用户界面和服务器的代码
if
Counties_e可以通过以下链接下载:
https://drive.google.com/file/d/1TOyZIADTCnRFyWLehxS7Td9v-BOZXARS/view?usp=sharing
答案 0 :(得分:0)
以下代码可能是一种解决方案。标签注释被添加并用作基本菜单。它不是真的很漂亮,需要做一些工作才能使其变得更好...
counties_e <- read.csv("~/Downloads/counties_e.csv", row.names=1, stringsAsFactors=FALSE)
library(ggiraph)
library(shiny)
library(ggplot2)
library(rlang)
ui_e <- fluidPage(
# Application title
titlePanel("Spatial Distribution of Environmental Issues in Iran during 1930 - 2018"),
fluidRow(column(
12,
ggiraph::ggiraphOutput("county_map")
))
)
min_ann_y <- min(counties_e$lat, na.rm = TRUE)
max_ann_y <- max(counties_e$lat, na.rm = TRUE)
y_pos <- seq(from = min_ann_y, to = max_ann_y, along.with = colnames(counties_e))
server_e <- function(input, output) {
rv <- reactiveValues(column = tail(colnames(counties_e), n = 1))
observeEvent(input$county_map_selected, {
rv$column <- input$county_map_selected
})
output$county_map <- renderggiraph({
tooltip_col <- sym(rv$column)
p <- ggplot(counties_e, aes(x = long, y = lat, group = group, fill = freq_prov_tot)) +
xlab("Longitude") + ylab("Lattitude") + labs(fill = "Number of Environmental Issues") +
coord_map("polyconic") +
scale_x_continuous(limits = c(40, NA)) +
geom_polygon_interactive(aes(tooltip = format(!!tooltip_col, trim = TRUE))) +
annotate_interactive(
"label", hjust = 0,
x = 40,
y = y_pos, fill = "#FF000009",
data_id = colnames(counties_e),
label = colnames(counties_e)
)
girafe_options(
girafe(ggobj = p),
opts_selection(
type = "single", selected = rv$column,
css = girafe_css(
css = "fill:purple;stroke:black;",
text = "stroke:none;fill:red;"
)
),
opts_hover(css = "stroke:none;fill:red;")
)
})
}
print(shinyApp(ui = ui_e, server = server_e))
答案 1 :(得分:0)
我决定使用函数watchEvent()使用其他格式。这包括以更好的方式将不同的列作为最终地图的输入。
但是,这不起作用,因为它拒绝响应selectInput函数。
这是我为此更改的ui和服务器代码
ui <- fluidPage(
# Application title
titlePanel("Spatial Distribution of Protest Events in Iran during 2005 - 2017"),
sidebarPanel(
selectInput(
inputId = "counties",
label = "counties",
choices = c("freq_prov_tot", "freq_prov_air")
)
),
fluidRow(column(12,
ggiraph::ggiraphOutput("county_map")))
)
server <- function(input, output) {
data2 <- observeEvent(input$choices, {counties})
output$county_map<- renderggiraph({
p<- ggplot(data2, aes(x=long, y=lat, group = group, fill = data2)) +
xlab("Longitude") + ylab("Lattitude") + labs(fill = "Number of Protest Events\n regarding Air Quality") +
coord_map("polyconic" ) +
geom_polygon_interactive(aes(tooltip = labs))
ggiraph(code = print(p))
})}
shinyApp(ui = ui, server = server)
它给出以下错误:“ data
必须是数据帧或fortify()
可强制执行的其他对象,而不是具有Observer / R6类的S3对象”
有人有解决这个问题的想法吗?