x轴按相反顺序排列

时间:2016-09-16 18:46:37

标签: r ggplot2

我使用以下方法创建3个直方图。第4个突然在x轴上有一个相反的顺序。但是,在片段中没有任何内容(至少我不知道)会影响订单。

The x-axis is expected to start with the lowest value on the left

预计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

2 个答案:

答案 0 :(得分:3)

您的两个数据集具有相同的因子length.classx级别,但您的第一个数据集中没有(100000,1000000]行,df。这是因为summarise没有drop = FALSE选项来保留数据集中所有级别的因子,无论它们是否有任何观察结果。

当您使用行中较少因子的数据集构建绘图时,当您添加具有更多因子级别且奇怪地排序事物的新图层时, ggplot2 看起来很混乱。

修复方法是使用drop = FALSE中的scale_x_discrete确保x轴不会丢弃任何因子级别。这样,对于两个数据集,您将使用相同的x轴因子级别,并且不会被错误排序。

+ scale_x_discrete(drop = FALSE)

答案 1 :(得分:1)

当给定文本标签时,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))

enter image description here

如果你只想要一张分布图,你可以用直方图更快:

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

enter image description here

(此外,将来尝试剥离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)