gpt4 book ai didi

R:使用 ggplot2 中的 free_x 重新排序 facet_wrapped x 轴

转载 作者:行者123 更新时间:2023-12-04 03:15:32 24 4
gpt4 key购买 nike

我正在尝试使用 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))

在从 this tab-separated file 读取的数据帧上运行该代码生成一个图,其中每个分面图的 x 轴仅部分排序。 Someone else on SO问了一个非常相似的问题,但唯一提出的解决方案是使用网格排列。因为我的数据集比那个问题中的数据集大很多,但这不会是一个非常快速的操作,所以我想问:有没有办法重新排序每个分面图的 x 轴,以便以递增(或递减)大小的顺序显示条形?如果其他人可以在这个问题上提供任何帮助,我将不胜感激。

最佳答案

问题是ggplot款待 V2作为单一因素;它不是子集 V2对于每个方面( V1 的值),然后将每个方面视为独立因素(不幸的是)。由于某些角色(“信使 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())



这在如此小的规模下看起来很糟糕(虽然不像你原来的情节那么糟糕......)。但是如果你让它变大(因为你必须播放 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())



同样,在这个小尺度上看起来很糟糕,但放大得更好。无论哪种方式,您都可能需要调整 size=... geom_text(...) 中的参数.

关于R:使用 ggplot2 中的 free_x 重新排序 facet_wrapped x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26238687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com