Создание столбчатой ​​диаграммы отфильтрованных столбцов с помощью ggplot2 - PullRequest
2 голосов
/ 20 апреля 2020

Expected Result

Не могли бы вы сказать мне, как я могу построить график, как показано? Я хочу выбрать только 2 лучших района для каждого города (2 лучших района на основе средних цен на жилье) и показать их средние цены. Конечно, гораздо приятнее, если столбцы имеют разные цвета .. (Обратите внимание, что я вручную выводю среднюю цену и отображаю ее в Excel, чтобы они не отражали реальных значений)

    glimpse(CityNeighbourhoodPrice)
Observations: 37,245
Variables: 3
$ City          <fct> Amsterdam, Amsterdam, Amsterdam...
$ Neighbourhood <fct> A,B,C,D,E,F,G,H,I,J,K...
$ Price         <int> 970, 1320, 2060, 2480, 1070, 12...

Вот мой код (это не работает):

CityNeighbourhoodPrice %>% 
  group_by(Neighbourhood) %>%
  count(n) %>%
  top_n(2, MedPrice) %>%
  summarise(MedPrice = median(Price, na.rm = TRUE)) %>%
  ggplot(aes(x = reorder(Neighbourhood,-MedPrice), y = MedPrice)) +
  geom_col(fill = "tomato3", width = 0.5)+
  labs(title="Ordered Bar Chart", 
       subtitle="Average Price by each Property Type", 
       caption="Image: 5") + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6))

Ответы [ 2 ]

3 голосов
/ 20 апреля 2020

Используя некоторые случайные данные примера, попробуйте это:

# Example data
set.seed(42)

CityNeighbourhoodPrice <- data.frame(
  City = rep(c("Amsterdam", "Berlin", "Edinburgh"), each = 30),
  Neighbourhood = rep(sample(LETTERS[1:5], 30, replace = TRUE), 3),
  Price = 3000 * runif(3 * 30)
)

library(ggplot2)
library(dplyr)
library(forcats)

# Plot
CityNeighbourhoodPrice %>% 
  group_by(City, Neighbourhood) %>%
  summarise(MedPrice = median(Price, na.rm = TRUE)) %>%
  top_n(2, MedPrice) %>%
  ungroup() %>% 
  arrange(City, MedPrice) %>% 
  mutate(City_Neighbourhood = paste0(Neighbourhood, "\n", City),
         City_Neighbourhood = forcats::fct_inorder(City_Neighbourhood)) %>% 
  ggplot(aes(x = City_Neighbourhood, y = MedPrice)) +
  geom_col(fill = "tomato3", width = 0.5)+
  labs(title="Ordered Bar Chart", 
       subtitle="Average Price by each Property Type", 
       caption="Image: 5") + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6))

Создано в 2020-04-20 пакетом Представить (v0.3.0)

0 голосов
/ 20 апреля 2020

Другим решением может быть:

скажем, ваши данные выглядят следующим образом:

library(dplyr)
library(ggplot)

data <- data.frame(Price=c(970, 245, 564, 895, 431, 100), City=c("Amsterdam", "Athens", "Amsterdam", "London", "Berlin", "Netherlands"), Neighborhood=c("A", "B", "D", "C", "E", "F"))

Затем вы делаете:

example_plot <- data %>%
  select(Price, City, Neighborhood) %>%
  group_by(City) %>%
  top_n(., 2, wt=Price) %>%
  spread(Neighborhood, Price) %>%
  data.frame %>%
  mutate(., Average=rowMeans(.[,-1], na.rm = TRUE)) %>%
  ggplot(., aes(City, Average, fill=City)) +
  ggtitle(str_wrap(c("Median Price for the Top-2 Neighborhoods in Different Cities:"), 20)) +
  theme_fivethirtyeight() +
  theme(legend.position = "none", plot.title = element_text(size= 22), axis.text = element_text(size=14))+
  geom_bar(stat = "identity") +
  geom_text(aes(x = City, y = Average, label = Average ), colour = "white", size = 11, vjust=1.2)

И это дает вам:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...