我使用以下方法创建3个直方图。第4个突然在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
答案 0 :(得分:3)
您的两个数据集具有相同的因子length.class
和x
的级别,但您的第一个数据集中没有(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))
如果你只想要一张分布图,你可以用直方图更快:
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)