问题描述
我正在使用ggplot2绘制各州每年发生的事件。我希望状态标签与数据表“ AZ CT NH NM DE ...”中显示的顺序相同,但是ggplot会自动按字母顺序“ AZ CT DE NH ...”重新组织状态标签。我创建了组,以便可以以“ num”个值(例如NM和TN)显示范围。请忽略组编号-我删除了一些数据点以使表更小。
ggplot(guidelines,aes(x = state,y = num,group = grp)) +
geom_point() + geom_line(linetype = "dotted") +
labs(x = "State",y = "Number") +
labs(title = "A") +
scale_y_continuous(breaks = seq(0,11,1),limits=c(0,11))
我尝试了以前文章中的建议来使用像这样的因子和水平:
guidelines$state <- factor(guidelines$state,levels = unique(guidelines$state)
但是它不起作用,因为我正在使用组并重复状态名称。关于如何解决这个问题的任何想法?
解决方法
尝试一下。您之所以接近,是因为您必须使用unique()
。在ordered=T
中添加factor()
将保持所需的顺序。这里是代码(请下次使用dput()
共享数据,因为有时使用屏幕截图中的数据确实很大可能会很复杂):
library(ggplot2)
#Data
guidelines <- data.frame(state=c('AZ','CT','NH','NM','DE','NJ','TN','TN'),num=c(10,10,5,2,5),grp=c(3,4,17,19,18,25,25),stringsAsFactors = F)
#Format factor
guidelines$state <- factor(guidelines$state,levels = unique(guidelines$state),ordered = T)
#Plot
ggplot(guidelines,aes(x = state,y = num,group = grp)) +
geom_point() + geom_line(linetype = "dotted") +
labs(x = "State",y = "Number") +
labs(title = "A") +
scale_y_continuous(breaks = seq(0,11,1),limits=c(0,11))
输出:
或者如 @TTS 在评论中所述,您可以将scale_x_discrete()
与limits
选项一起使用:
#Data
guidelines <- data.frame(state=c('AZ',stringsAsFactors = F)
#Plot 2
ggplot(guidelines,11))+
scale_x_discrete(limits=unique(guidelines$state))
输出:
,我们可以使用ordered
library(dplyr)
library(ggplot2)
guidelines %>%
mutate(state =ordered(state,levels = unique(state))) %>%
ggplot(aes(x = state,group = grp)) +
geom_point() +
geom_line(linetype = "dotted") +
labs(x = "State",y = "Number") +
labs(title = "A") +
scale_y_continuous(breaks = seq(0,11))
-输出