2017-02-15 152 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(X =重新排序(市,City.Id,長度)))+ geom_bar()'。 – eipi10

+0

@thisisrg我嘗試過使用該行,但是df保持不變 – Javi

+0

我添加了該圖。你忘了'長度'? – thisisrg