下图是“伪”字样。甘特图旨在描述一些战争的持续时间(日历年的x轴)加上伤亡人数。如果你能帮助我解决我面临的两个问题,我将不胜感激。
1)我想根据每个国家(facet WarLocationCountry)中每个战争(geom_segment)的开始日期(war.start)对y轴标签(变量/因子WarName)进行排序。我想最早开始的战争是在y轴之上;例如对于苏丹来说,订购应该是:第一个南苏丹,第二个南苏丹,Spla部门,达尔富尔。
我认为它与scale_y_discrete(rev(levels(CoW.tmp $ WarLocationCountry))有关,但我无法弄清楚如何使它依赖于CoW.tmp $ war.start。
2)geom_text在geom_segments旁边添加估计伤亡人数(sum.deaths; numeric);这些估计包括几个NA /缺失数据。每当我将它们保留为NA时,我都会收到错误消息:错误:' x'和'单位'必须有长度> 0;我想通过将na.rm = TRUE添加到geom_text部分,这将得到解决,但遗憾的是并非如此。
目前缺失的数据用0编码。 CoW.tmp $ sum.deaths [CoW.tmp $ sum.deaths == 0]< - NA在运行ggplot代码时导致错误。
很抱歉没有以更一般的方式制定此问题。非常感谢任何提示。
图表代码:
CoW.plot <- ggplot(CoW.tmp) +
geom_segment(aes(color=WarType, x=war.start, xend=war.end, y=WarName, yend=WarName), size=1) +
geom_point(aes(shape=Outcome2, color=WarType, x=war.end,y=WarName), size=3)+
geom_point(aes(shape=WarType, color=WarType, x=war.start,y=WarName), size=3)+
theme(plot.title=element_text(face="bold"),
legend.position="bottom",
legend.title=element_text(size=7),
legend.text=element_text(size=5),
legend.box="horizontal",
axis.title.x = element_blank(),
axis.text.x = element_text(size=5),
axis.title.y = element_blank(),
axis.text.y = element_text(size=5, face="bold"))+
scale_color_discrete(name="War Type:",
breaks=c("4","5","6","7"),
labels=c("central control","local issues","regional internal","intercommunal"))+
scale_shape_manual(values=c(1,3,4,5,6,7), name="Outcome:",
breaks=c("1","3","4","5","6","7"),
labels=c("victory", "compromise","transformed type of war","ongoing","stalemate","continues below war threshold"))+
geom_text(aes(x=as.Date(conflict.end+1500), y=WarName, label=sum.deaths), size=2, na.rm=TRUE)+
scale_x_date(limits = c(as.Date("1946-01-01"), as.Date("2010-01-01")))+
ggtitle(paste("INTRA-STATE CONFLICTS (CoW)",a,"\n"))+
facet_wrap(~WarLocationCountry, scales="free_y", ncol=1)
数据:
CoW.tmp<-structure(list(conflict.end = structure(c(788, -2178, -1310,
3648, 5921, 6569, 12793, 12793, 6496, 8881, 7695, 9609, 8354,
9876, 9876, 9876, 9876, 9876, 9876, 9876, 11271, 11271, 11271,
11271, 11271, 11271, 11271, 11271, 11271, 13493, 14041, 14041,
14041, 14041), class = "Date"), WarType = structure(c(2L, 1L,
2L, 1L, 2L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L
), .Label = c("4", "5", "7"), class = "factor"), war.start = structure(c(-2284,
-2181, -1319, 1092, 3994, 4762, 5068, 8140, 6070, 6562, 6720,
7751, 7909, 8382, 7988, 8382, 8382, 8382, 8382, 8382, 10263,
10263, 10263, 10263, 11085, 11088, 11088, 11088, 11088, 12109,
13520, 13213, 13430, 13440), class = "Date"), war.end = structure(c(788,
-2178, -1310, 3648, 5921, 6569, 7908, 12793, 6496, 8881, 7695,
9609, 8354, 9190, 9876, 9190, 9190, 9190, 8849, 9190, 10779,
10779, 10779, 10779, 11271, 11271, 11271, 11271, 11271, 13493,
13667, 14031, 14041, 14041), class = "Date"), WarName = c("First South Sudan",
"Zanzibar Arab-African", "First Uganda", "Rhodesia", "Second Uganda",
"Matabeleland", "Second South Sudan", "Second South Sudan", "Holy Spirit Movement",
"Inkatha-ANC", "First Somalia", "First Sierra Leone", "The SPLA Division (Dinka-Nuer) War",
"Second Somalia", "Second Somalia", "Second Somalia", "Second Somalia",
"Second Somalia", "Second Somalia", "Second Somalia", "Second Sierra Leone",
"Second Sierra Leone", "Second Sierra Leone", "Second Sierra Leone",
"Second Sierra Leone", "Second Sierra Leone", "Second Sierra Leone",
"Second Sierra Leone", "Second Sierra Leone", "Darfur", "Third Somalia",
"Third Somalia", "Third Somalia", "Third Somalia"), Outcome2 = structure(c(3L,
1L, 1L, 1L, 1L, 1L, 3L, 3L, 1L, 6L, 1L, 1L, 7L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 1L, 1L, 1L,
1L), .Label = c("1", "2", "3", "4", "5", "6", "7"), class = "factor"),
sum.deaths = c("0", "0", "0", "11000", "46000", "0", "0",
"0", "7000", "0", "0", "0", "0", "70", "70", "70", "70",
"70", "70", "70", "0", "0", "0", "0", "0", "0", "0", "0",
"0", "0", "0", "0", "0", "0"), WarLocationCountry = structure(c(4L,
6L, 5L, 7L, 5L, 7L, 4L, 4L, 5L, 3L, 2L, 1L, 4L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 2L,
2L, 2L, 2L), .Label = c("Sierra Leone", "Somalia", "South Africa",
"Sudan", "Uganda", "Zanzibar", "Zimbabwe"), class = "factor")), .Names = c("conflict.end",
"WarType", "war.start", "war.end", "WarName", "Outcome2", "sum.deaths",
"WarLocationCountry"), class = "data.frame", row.names = c(34L,
39L, 44L, 67L, 114L, 120L, 127L, 128L, 134L, 136L, 138L, 152L,
155L, 157L, 158L, 159L, 160L, 161L, 162L, 163L, 197L, 198L, 199L,
200L, 201L, 202L, 203L, 204L, 205L, 237L, 246L, 247L, 248L, 249L
))
答案 0 :(得分:3)
这样的东西?
library(ggplot2)
CoW.tmp <- with(CoW.tmp,CoW.tmp[order(WarLocationCountry,-as.integer(war.start)),])
CoW.tmp$WarName <- with(CoW.tmp,factor(WarName,levels=unique(WarName)))
ggplot(CoW.tmp) +
geom_segment(aes(color=WarType, x=war.start, xend=war.end, y=WarName, yend=WarName), size=1) +
geom_point(aes(shape=Outcome2, color=WarType, x=war.end,y=WarName), size=3)+
geom_point(aes(shape=WarType, color=WarType, x=war.start,y=WarName), size=3)+
theme(plot.title=element_text(face="bold"),
legend.position="bottom",
legend.title=element_text(size=7),
legend.text=element_text(size=5),
legend.box="vertical",
axis.title.x = element_blank(),
axis.text.x = element_text(size=10),
axis.title.y = element_blank(),
axis.text.y = element_text(size=10, face="bold"))+
scale_color_discrete(name="War Type:",
breaks=c("4","5","6","7"),
labels=c("central control","local issues","regional internal","intercommunal"))+
scale_shape_manual(values=c(1,3,4,5,6,7), name="Outcome:",
breaks=c("1","3","4","5","6","7"),
labels=c("victory", "compromise","transformed type of war","ongoing","stalemate","continues below war threshold"))+
geom_text(aes(x=as.Date(conflict.end+1500), y=WarName, label=ifelse(sum.deaths!=0,sum.deaths,"")), size=3, na.rm=TRUE)+
scale_x_date(limits = c(as.Date("1946-01-01"), as.Date("2010-01-01")))+
ggtitle(paste("INTRA-STATE CONFLICTS (CoW)","","\n"))+
facet_wrap(~WarLocationCountry, scales="free_y", ncol=1)
你的第一个问题,即y轴的排序,比评论建议的更微妙。您需要按开始日期按国家/地区的相反顺序进行战争。我认为,最简单的方法是按国家和开始日期重新排序整个数据框CoW.tmp
,然后将WarName
因子的级别重置为该顺序(前两行)代码)。您无法在-war.start
函数的调用中使用order(...)
,因为一元减号不适用于日期,因此我们必须使用-as.integer(war.start)
。这将返回一个整数,表示自1970-01-01以来的天数,我们可以将其反转。
即使这只是部分解决方案。在你的数据集中似乎有几个重复的记录(第二次索马里战争似乎在那里多次,其他几个)。苏丹人民解放军战争在苏丹第二次战争的第一次爆发后和二次爆发之前开始,这就产生了苏丹的问题。这就是在这种情况下y轴没有正确排序的原因。
关于标签的第二个问题已在上面的评论中得到解决。
另请注意,我调整了字体大小并设置legend.box="vertical"
只是为了在SO上显示良好的图像。如果您要导出为pdf或其他格式,则需要将其更改回来。