我有以下数据集:
data <- structure(list(country = c("Andorra", "Austria", "Belgium", "Denmark", "Finland", "France", "Germany", "Greece"), x48 = c(811.73, 710.0385, 765.8359, 961.434, 701.9176, 716.7308, 701.6187, 468.1942), x49 = c(655.2433, 607.8058, 628.3675, 692.426, 575.4287, 587.7711, 544.2052, 370.2103), x54 = c(2801.597, 2224.757, 2320.216, 3130.023, 2582.625, 2399.011, 2621.368, 804.5603)), class = "data.frame", row.names = c(NA, -8L))
我想绘制一个双条形图,在x轴上为每个国家显示一个值为'x54'的条形图和一个值为'x48'或'x49'的条形图,如下所示:
使用以下代码:
library(shiny)
library(ggplot2)
library(tidyverse)
df <- read.csv("data/salario-apartamento-europa-occidental-pequeño.csv")
ui = fluidPage(
titlePanel("Triple Bar Chart"),
sidebarLayout(
sidebarPanel(
selectInput("x1", "Type of house:", choices = names(df)[-1], selected = names(df)[1]),
),
mainPanel(
plotOutput("plot")
)
)
)
server = function(input, output) {
output$plot <- renderPlot({
df_long <- df %>% pivot_longer(-country)
ggplot(data = df_long %>%
filter(name %in% c("x49", "x54")),
aes(x = country, y = value, fill = factor(name))) +
geom_col(position = position_dodge())+
scale_fill_manual(values = c("#58C114", "#DA560A")) +
theme_light() +
theme(axis.text.x = element_text(angle = 90)) +
scale_color_manual(name = "Metric", labels = c("1 room in the center", "Average Monthly Salary")) +
labs(fill =" Metric", x= "Country", y= "USD")
})
}
# run the app
shinyApp(ui, server)
我可以像你看到的那样做,但是你会意识到,我不是通过'x54'和输入变量'x1'过滤,而是通过'x49'过滤,因此,为了比较'x54'和'x48',我必须在代码中手动更改它,而不是被动地进行。
我想有类似的东西:
filter(name %in% c(input$x1, "x54"))
但不幸的是,这不起作用,它只绘图'x54'。
还有,我该如何相应地更新标签呢?(现在它们保持像"x49"和"x54"一样,就像你在图片中看到的那样)
应该是这样的:
***对于"x54":***平均月薪
***对于"x48":***1个房间位于中心
***对于"x49":***中心外的1个房间
非常感谢您的帮助提前!
2条答案
按热度按时间dxxyhpgq1#
在
selectInput
中,使用的对象是data
,而不是df
其中
gdrx4gfi2#
您的
input
必须是被动的。https://mastering-shiny.org/basic-reactivity.html您的服务器需要看起来更像这样。