2017-02-15 3 views
2

В первый раз, спрашивая здесь, простите меня, если я не достаточно ясен.Сортировочные бары в гистограмме с ggplot2

До сих пор я видел много ответов на подобные вопросы, которые объясняют, как сортировать бары по некоторому полю кадра данных; но я был не в состоянии найти, как сортировать их по стату по умолчанию «Количество» geom_bar Например, я запускаю этот код (который, очевидно, не поле кадра данных.):

library(ggplot2) 

Name <- c('Juan','Michael','Andrea','Charles','Jonás','Juan','Donata','Flavia') 
City <- c('Madrid','New York','Madrid','Liverpool','Madrid','Buenos Aires','Rome','Liverpool') 
City.Id <- c(1,2,1,3,1,4,5,3) 
df = data.frame(Name,City,City.Id) 

a <- ggplot(df,aes(x = City, text=paste("City.Id=",City.Id))) + 
geom_bar() 

ggplotly(a) 

И тогда я хотел бы визуализировать полученные бары, упорядоченные по их высоте (= count.) Обратите внимание, что я должен сохранить информацию «City.Id», чтобы показать ее в последнем сюжете. Как это может быть сделано?

ответ

4

Учитывая, что вы уже используете ggplot2, я хотел бы предложить, глядя на то, что еще tidyverse может предложить. А именно пакет forcats для работы с факторами.

forcats имеет приятную функцию fct_infreq(), которая будет устанавливать уровни фактора в порядке их частоты. Если данные являются символьным вектором, то уже не множитель (например, City в ваших данных), тогда он сначала сделает его фактором, а затем установит уровни в частотном порядке.

Попробуйте этот код:

# Load packages 
library(ggplot2) 
library(forcats) 

# Create data 
Name <- c('Juan','Michael','Andrea','Charles','Jonás','Juan','Donata','Flavia') 
City <- c('Madrid','New York','Madrid','Liverpool','Madrid','Buenos Aires','Rome','Liverpool') 
City.Id <- c(1,2,1,3,1,4,5,3) 
df = data.frame(Name,City,City.Id) 

# Create plot 
a <- ggplot(df, aes(x = fct_infreq(City), text=paste("City.Id=",City.Id))) + 
    geom_bar() 

a 
2

Можно использовать reorder:

df$City <- reorder(df$City,df$City.Id,length) 

и затем участок с кодом в вопросе.

enter image description here

+3

Вы можете сделать это на лету, в вызове ggplot: 'ggplot (DF, AES (х = перезаказа (Город, City.Id, длина))) + geom_bar() '. – eipi10

+0

@thisisrg Я пробовал использовать эту линию, но df остается тем же – Javi

+0

Я добавил цифру. Вы забыли «длину»? – thisisrg

Смежные вопросы