簡體   English   中英

x軸順序相反

[英]x-axis in reverse order

我使用以下方法創建3個直方圖。 第四個在x軸上突然相反。 但是,該片段中沒有任何內容(至少我對此一無所知)會影響順序。

x軸應從左側的最小值開始

x軸應從左側的最小值開始。

這是R代碼:

df <- mydata %>% mutate(length.class=cut(mydata$count,breaks = c(1,10,100,1000,10000,100000,1000000,10000000),include.lowest=TRUE,dig.lab=8)) %>% group_by(length.class) %>% summarise(count = n())
dftext <- as.data.frame(table(df$length.class))
colnames(dftext)[1] <- "x"
dftext$lab[dftext$x == "[1,10]"] <- 1063393
dftext$lab[dftext$x == "(10,100]"] <- 65986
dftext$lab[dftext$x == "(100,1000]"] <- 3206
dftext$lab[dftext$x == "(1000,10000]"] <- 386
dftext$lab[dftext$x == "(10000,100000]"] <- 32
dftext$lab[dftext$x == "(100000,1000000]"] <- 0
dftext$lab[dftext$x == "(1000000,10000000]"] <- 1

df$count[df$length.class == "(1000000,10000000]"] <- 1.1  // To make its bar visible

fmt <- function(decimals=0){
    function(x) format(x,scientific = FALSE)
}

ggplot(df,aes(length.class,count)) + geom_bar(stat = "identity",width=0.9,fill="#999966") + scale_y_log10(labels = fmt()) + labs(x="", y="") + geom_text(data=dftext, aes(x=x, y=2, label=lab), size = 6) + theme(text = element_text(size=20)) +
    theme(axis.line = element_line(colour = "black"),
          panel.grid.major = element_line(color = "grey"),
          panel.grid.minor = element_line(color = "grey"),
          panel.background = element_blank(),
          axis.title.x = element_text(margin=margin(t = 15, unit = "pt")),
          axis.text.x = element_text(angle = 45, hjust = 1))

是什么導致反向訂單,我該如何消除它?

編輯:你們很快! :) @ mark-peterson的答案看起來很扎實,但是我沒有得到任何有效的結果。 這是請求的數據: mydata.csv

你的兩個數據集已因素相同的水平 length.classx ,但沒有一行(100000,1000000]你的第一個數據集,DF,這是由於summarise有沒有drop = FALSE選項保留的各級不管數據集是否有任何觀察值,都會在數據集中使用

當您使用行中具有較少因子的數據集構建圖時,當您添加具有更多因子水平的新圖層時, ggplot2會感到困惑,並且事情變得奇怪。

解決方法是通過在scale_x_discrete使用drop = FALSE來確保x軸不會降低任何因子水平。 這樣,您將為兩個數據集使用相同的x軸因子水平,並且不會出現錯誤排序的情況。

+ scale_x_discrete(drop = FALSE)

給定文本標簽后, geom_bar將轉換為一個因子並對條形進行排序。 我猜想,字母和數字與您以前的用法相匹配,但並非與此相符。 我以為@Pierre關於scale_x_reverse()是正確的,但它似乎不適用於因素。 相反,您將需要自行設置因子順序。 沒有樣本數據,很難做到這一點。

但是,一個更好的問題是,為什么您要在這里手工做這么多的工作。 這些工具可以自動完成大部分設置,並具有減少錯誤和正確分類因素的額外好處。 例如,使用一些可重現的數據:

temp <- data.frame(a = 1:999)

temp$binned <-
  cut(temp$a, 10^(0:3), include.lowest = TRUE)

forText <-
  table(temp$binned) %>%
  as.data.frame()

ggplot(temp, aes(x = binned)) +
  geom_bar() +
  geom_text(data = forText
            , aes(x = Var1
                  , y = 75
                  , label = Freq))

在此處輸入圖片說明

如果只需要一張分布圖,則使用直方圖可以更快:

ggplot(temp, aes(a)) +
  geom_histogram() +
  scale_x_log10()

在此處輸入圖片說明

(此外,將來,請嘗試簡化為MWE-如果它們與問題無關,則無需包括許多theme設置。)

使用發布的數據,我可以按照上面的方法進行設計。 請注意,您將需要添加其他主題和縮放​​參數。 您還需要使用@aosmith關於缺失值的答案。 (我認為,這意味着@aosmith的回答實際上回答了您的問題,而我的回答可能只是如何更快地執行此操作的好建議。)

mydata$binned <-
  cut(mydata$count,breaks = c(1,10,100,1000,10000,100000,1000000,10000000),include.lowest=TRUE,dig.lab=8)

forText <-
  table(mydata$binned) %>%
  as.data.frame()

ggplot(mydata, aes(x = binned)) +
  geom_bar() +
  geom_text(data = forText
            , aes(x = Var1
                  , y = 75
                  , label = Freq)) +
  scale_x_discrete(drop = FALSE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM