试试这个:
#set wd & environment----
#setwd("/Users/OldJess/Dropbox/R Stuff (Home)/ShinyNames")
#load packages------
library(datasets)
library(ggplot2)
library(viridis)
library(ggthemes)
library(gridExtra)
library(dplyr)
library(shiny)
library(shinythemes)
#base <- read.csv("data/NationalNamesBrief.csv", stringsAsFactors = FALSE, row.names = NULL, na.strings = c("NA","","#MULTIVALUE"))
#temporary df for demonstration purposes
base <- structure(list(Name = c("Ellie", "Ellie", "Ellie", "Ellie", "Ellie", "Ellie"),
Year = c(1880L, 1881L, 1882L, 1883L, 1883L, 1884L),
Gender = c("F", "F", "F", "F", "M", "F"),
Count = c(17L, 27L, 37L, 24L, 7L, 28L)),
.Names = c("Name", "Year", "Gender", "Count"),
row.names = c(NA, 6L), class = "data.frame")
#clean data----
base$name <- tolower(base$Name)
base$MF <- as.factor(base$Gender)
#add ranking data by Year
base <- base %>%
group_by(Year) %>%
arrange(Year, desc(Count)) %>%
mutate(Rank = row_number())
#add ranking data by Year AND Gender
base <- base %>%
group_by(Year, Gender) %>%
arrange(Year, desc(Count)) %>%
mutate(GenderRank = row_number())
#create functions----
#function to create line & heat charts
lineHeatCharts <- function(pickaname){
pickanameLower <- tolower(pickaname)
if(!any(base$name %in% pickanameLower)){
return()
}
subDf <- subset(base[base$name == pickanameLower,])
heat <- ggplot(subDf, aes(x = Year, y = MF, fill = Count)) +
scale_fill_viridis(name = "",
option = "B",
limits = c(0, max(subDf$Count))) +
geom_tile(color = "white", size = 0) +
theme_tufte() +
theme(axis.text.x = element_text(angle = 90, vjust = 1, hjust = 1),
axis.ticks.x = element_blank()) +
scale_x_continuous(breaks = seq(min(subDf$Year), max(subDf$Year), by = 5)) +
labs(x = "Year", y = "")
line <- ggplot(subDf, aes(x = Year, y = Count, fill = MF)) +
geom_line(aes(colour = factor(subDf$Gender)), size = 1.5) +
theme_tufte() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
scale_x_continuous(breaks = seq(min(subDf$Year),
max(subDf$Year), by = 5)) +
labs(x = "", y = "", color = "")
return(grid.arrange(line, heat, ncol = 1, nrow = 2, heights = c(5, 2), top = max(subDf$Name)))
}
ui <- fluidPage(theme = shinytheme("flatly"),
# Application title
titlePanel("First Names on U.S. Social Security Applications, 1880 - 2014"),
sidebarLayout(
sidebarPanel(
textInput(inputId = "list", label = "Enter a name:", value = "Ellie"),
helpText("Note: This page will take about 30 seconds to load the first time you open it. Data are from US Social Security applications via data.gov. For privacy, only names with at least 5 babies per year are included. Errors in Social Security form submission, like incorrect sex, are not corrected. Names with special characters and spaces are not included."),
submitButton("Refresh View")
),
mainPanel(
h4(""),
plotOutput("view")
)
)
)
server <- function(input, output, session) {
output$view <- renderPlot({
lineHeatCharts(input$list)
})
}
shinyApp(ui, server)