duh*_*ime 10 plot r facet ggplot2
我正在尝试reorder使用scales = free_x在ggplot2 中也使用的小面包裹的绘图,但是重新排序功能没有正确地重新排序x轴.这是我正在运行的:
library(ggplot2)
df <- read.table("speaking_distribution_by_play.txt",
header = F,
sep = "\t")
ggplot(df, aes(x=reorder(V2, V3), y=V3)) +
geom_bar(stat = "identity") +
facet_wrap(~V1, ncol = 4, scales = "free_x") +
opts(title = "Distribution of Speakers in Shakespearean Drama") +
xlab("Speaking Role") +
ylab("Words Spoken") +
opts(axis.text.x=theme_text(angle=90, hjust=1))
Run Code Online (Sandbox Code Playgroud)
在从此制表符分隔文件中读取的数据框上运行该代码会生成一个图,其中每个分面图的x轴仅部分排序.SO上的其他人提出了一个非常相似的问题,但唯一提出的解决方案是使用网格排列.因为我的数据集比那个问题中的数据集要大得多,所以这不会是一个非常迅速的操作,所以我想问:有没有办法重新排序每个刻面图的x轴,以便显示尺寸增加(或减少)的条形?我非常感谢其他人可以在这个问题上提供任何帮助.
Wal*_*ltS 10
使用稍微不同的方法,您可以将标签保留在图表下方的区域中.此版本通过以类似于jlhoward方法的方式连接V1和V2来创建唯一的x中断,但随后使用scale_x_discrete语句中下面的代码中的函数角色将V2恢复为x标签.
library(ggplot2)
df <- read.table("speaking_distribution_by_play.txt",
header = F,
sep = "\t")
# Creates a small test subset; remove for complete set
df <- df[df$V1 %in% c("Mac.xml","MM.xml","MND.xml","MV.xml"),]
# used to create x-axis label restoring original name of role
roles <- function(x) sub("[^_]*_","",x )
ggplot(cbind(df, V4=paste(df$V1,df$V2,sep="_")), aes(x=reorder(V4,V3), y=V3) ) +
geom_bar(stat = "identity") +
facet_wrap(~ V1, ncol=4, scales = "free_x") +
labs(title = "Distribution of Speakers in Shakespearean Drama") +
xlab("Speaking Role") +
ylab("Words Spoken") +
scale_x_discrete(labels=roles) +
theme(axis.text.x=element_text(angle=90, hjust=1))
Run Code Online (Sandbox Code Playgroud)

问题在于ggplot将对待V2视为一个单一因素 ; 它不是V2每个方面的子集(值V1),然后将每个方面视为独立因素(不幸的是).由于某些角色("Messenger 1"等)出现在多个游戏中,因此这些级别会根据它们在遇到它们的第一个游戏中的重要性进行排序.
有一种解决方法,但这有点像黑客攻击:你需要通过将播放的名称连接到每个角色来使角色唯一,然后将其用作x值.要恢复原始角色,请关闭轴文本,而不是geom_text(...)用于条形标签.这是一个例子:
gg <- df[order(df$V1,-df$V3),] # reorder by play and lines
gg$lvl <- with(df,paste(V2,V1,sep="."))
ggplot(gg[gg$V1 %in% unique(df$V1)[1:4],],
aes(x=factor(lvl,levels=unique(lvl)), y=V3)) +
geom_text(aes(y=5,label=V2),angle=90,size=3,hjust=-0)+
geom_bar(stat = "identity", fill="blue",alpha=0.2) +
facet_wrap(~V1, ncol = 2, scales="free_x") +
labs(title="Distribution of Speakers in Shakespearean Drama",
x="Speaking Role", y="Words Spoken") +
theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())
Run Code Online (Sandbox Code Playgroud)

这看起来很糟糕(虽然......不像原来的情节那么糟糕).但是如果你把它做得更大(因为你将要做38场比赛,没有??),那么你可以看到标签和条形图.如果你真的想要条形图下方的标签,请使用以下内容:
ggplot(gg[gg$V1 %in% unique(df$V1)[1:4],],
aes(x=factor(lvl,levels=unique(lvl)), y=V3)) +
geom_text(aes(y=-5,label=V2),angle=90,size=3,hjust=1)+
ylim(-500,NA)+
geom_bar(stat = "identity", fill="lightblue") +
facet_wrap(~V1, ncol = 2, scales="free_x") +
labs(title="Distribution of Speakers in Shakespearean Drama",
x="Speaking Role", y="Words Spoken") +
theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())
Run Code Online (Sandbox Code Playgroud)

再次,这个小规模看起来很糟糕,但更好的扩大.无论哪种方式,您都可能需要调整size=...参数geom_text(...).