首页 > 解决方案 > R:bar ggplot2错误:分面变量必须至少有一个值

问题描述

尝试绘制图表时出现错误。这是错误信息。

'预计 2 件。缺少 1 行中填充的部分NA[24216]。错误:分面变量必须至少具有一个值'

#Load Libaries

library(ggplot2)
library(dplyr)
options(scipen = 100000)
library(scales)
library(plotly)
library(tidyverse)

#Read dataset
ura <- read.csv('URAdata_new.csv') 

#Data cleaning
ura <- ura %>% mutate(Date.of.Sale_month = str_split(ura$Date.of.Sale, '-', simplify = T)[, 1],
               Date.of.Sale_year = str_split(ura$Date.of.Sale, '-', simplify = T)[, 2])

#Plotly Graph in issue
  
    Plot2 <- ggplotly(ura %>%
           separate(Date.of.Sale, c('Sale_year', 'Sale_month'), sep = '-') %>%
           filter(Sale_year %in% c(16, 17) & Postal.District %in% c(2, 5)) %>%
           group_by(Sale_year, Postal.District) %>%
           summarize(avg_price = mean(Price....)) %>%
           ggplot(aes(x = as.character(Postal.District), y = avg_price, 
                      fill = as.factor(Sale_year))) + 
           geom_col() + 
           facet_grid(~ as.factor(Sale_year)) +
           labs(x = 'Postal District', y = 'Average price', 
                title = 'Comparison of unit prices in district 2 and 5 between 2016 and 2017') +
           scale_fill_discrete(name = "Year of sale", labels = c("2016", "2017"))+
           theme(
             plot.title = element_text(colour="red",size=10, face="bold.italic",hjust = 0.5),
             axis.title.x = element_text(colour="blue",size=14, face="bold"),
             axis.title.y = element_text(colour="green",size=14, face="bold"), 
             legend.title=element_text(size=8))+
           scale_y_continuous(name="Average Price",labels = comma), main="foo")
Plot2

这些是我上面的代码。

输入(头(乌拉,20)

structure(list(Project.Name = c("V ON SHENTON", "V ON SHENTON", 
"STIRLING RESIDENCES", "PARC CLEMATIS", "STIRLING RESIDENCES", 
"ONE PEARL BANK", "TWIN VEW", "WHISTLER GRAND", "WHISTLER GRAND", 
"WHISTLER GRAND", "WHISTLER GRAND", "WHISTLER GRAND", "KENT RIDGE HILL RESIDENCES", 
"KENT RIDGE HILL RESIDENCES", "KENT RIDGE HILL RESIDENCES", "KENT RIDGE HILL RESIDENCES", 
"KENT RIDGE HILL RESIDENCES", "KENT RIDGE HILL RESIDENCES", "KENT RIDGE HILL RESIDENCES", 
"STIRLING RESIDENCES"), Street.Name = c("SHENTON WAY", "SHENTON WAY", 
"STIRLING ROAD", "JALAN LEMPENG", "STIRLING ROAD", "PEARL BANK", 
"WEST COAST VALE", "WEST COAST VALE", "WEST COAST VALE", "WEST COAST VALE", 
"WEST COAST VALE", "WEST COAST VALE", "SOUTH BUONA VISTA ROAD", 
"SOUTH BUONA VISTA ROAD", "SOUTH BUONA VISTA ROAD", "SOUTH BUONA VISTA ROAD", 
"SOUTH BUONA VISTA ROAD", "SOUTH BUONA VISTA ROAD", "SOUTH BUONA VISTA ROAD", 
"STIRLING ROAD"), Type = c("Apartment", "Apartment", "Apartment", 
"Apartment", "Apartment", "Apartment", "Apartment", "Apartment", 
"Apartment", "Apartment", "Apartment", "Apartment", "Apartment", 
"Apartment", "Apartment", "Apartment", "Apartment", "Apartment", 
"Apartment", "Apartment"), Postal.District = c(1L, 1L, 3L, 5L, 
3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 3L
), Market.Segment = c("CCR", "CCR", "RCR", "OCR", "RCR", "RCR", 
"OCR", "OCR", "OCR", "OCR", "OCR", "OCR", "RCR", "RCR", "RCR", 
"RCR", "RCR", "RCR", "RCR", "RCR"), Tenure = c("99 yrs lease commencing from 2011", 
"99 yrs lease commencing from 2011", "99 yrs lease commencing from 2017", 
"99 yrs lease commencing from 2019", "99 yrs lease commencing from 2017", 
"99 yrs lease commencing from 2019", "99 yrs lease commencing from 2017", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2018", "99 yrs lease commencing from 2018", 
"99 yrs lease commencing from 2017"), Type.of.Sale = c("Resale", 
"Resale", "New Sale", "New Sale", "New Sale", "New Sale", "New Sale", 
"New Sale", "New Sale", "New Sale", "New Sale", "New Sale", "New Sale", 
"New Sale", "New Sale", "New Sale", "New Sale", "New Sale", "New Sale", 
"New Sale"), No..of.Units = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Price.... = c(3548000L, 
3490000L, 1987000L, 1745000L, 1227000L, 1702000L, 1899000L, 704380L, 
1129960L, 1145540L, 1473540L, 1421880L, 1367000L, 1360000L, 3000000L, 
870000L, 1711000L, 899000L, 870000L, 1249000L), Nett.Price.... = c("-", 
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", 
"-", "-", "-", "-", "-", "-"), Area..Sqft. = c(1518L, 1518L, 
1055L, 1044L, 635L, 700L, 1249L, 441L, 764L, 764L, 990L, 958L, 
775L, 786L, 1776L, 484L, 958L, 484L, 484L, 635L), Type.of.Area = c("Strata", 
"Strata", "Strata", "Strata", "Strata", "Strata", "Strata", "Strata", 
"Strata", "Strata", "Strata", "Strata", "Strata", "Strata", "Strata", 
"Strata", "Strata", "Strata", "Strata", "Strata"), Floor.Level = c("46 to 50", 
"46 to 50", "26 to 30", "06 to 10", "31 to 35", "21 to 25", "26 to 30", 
"21 to 25", "21 to 25", "21 to 25", "31 to 35", "31 to 35", "01 to 05", 
"01 to 05", "01 to 05", "01 to 05", "01 to 05", "01 to 05", "01 to 05", 
"16 to 20"), Unit.Price...psf. = c(2338L, 2299L, 1884L, 1671L, 
1932L, 2433L, 1521L, 1596L, 1479L, 1499L, 1488L, 1484L, 1764L, 
1731L, 1689L, 1796L, 1786L, 1856L, 1796L, 1967L), Date.of.Sale = c("20-Jun", 
"20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", 
"20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun", 
"20-Jun", "20-Jun", "20-Jun", "20-Jun", "20-Jun")), row.names = c(NA, 
20L), class = "data.frame")

谷歌表格链接:https ://docs.google.com/spreadsheets/d/1QFXNUpgEjjPGdfXUwvzYIadnoxcD2-Ba6cw6BqrxfO8/edit

标签: rggplot2dplyrplotly

解决方案


您不需要同时运行str_split代码和separate代码,只运行其中一个。

library(tidyverse)
library(plotly)

ura <- read.csv('URA Dataset  - URAdata_new.csv')

ggplotly(ura %>%
     separate(Date.of.Sale, c('Sale_year', 'Sale_month'), sep = '-') %>%
     filter(Sale_year %in% c(16, 17) & Postal.District %in% c(2, 5)) %>%
     group_by(Sale_year, Postal.District) %>%
     summarize(avg_price = mean(Price....)) %>%
     ggplot(aes(x = as.character(Postal.District), y = avg_price, 
                fill = as.factor(Sale_year))) + 
     geom_col() + 
     facet_grid(~ as.factor(Sale_year)) +
     labs(x = 'Postal District', y = 'Average price', 
          title = 'Comparison of unit prices in district 2 and 5 between 2016 and 2017') +
     scale_fill_discrete(name = "Year of sale", labels = c("2016", "2017"))+
     theme(
       plot.title = element_text(colour="red",size=10, face="bold.italic",hjust = 0.5),
       axis.title.x = element_text(colour="blue",size=14, face="bold"),
       axis.title.y = element_text(colour="green",size=14, face="bold"), 
       legend.title=element_text(size=8))+
     scale_y_continuous(name="Average Price",labels = comma), main = 'foo')

在此处输入图像描述


推荐阅读