2

以下のグラフは、一部の戦争の期間 (X 軸は暦年) と犠牲者数を表す「疑似」ガント チャートです。私が直面している2つの問題を解決するのを手伝っていただければ幸いです。

1) 各国 (ファセット WarLocationCountry) 内の各戦争 (geom_segment) の開始日 (war.start) に従って、y 軸ラベル (変数/因子 WarName) を並べ替えたいと思います。最も早く始まる戦争が y 軸の上にあることを望みます。例えば、スーダンの場合、順序は次のようになります。最初の南スーダン、2 番目の南スーダン、スプラ師団、ダルフール。

scale_y_discrete(rev(levels(CoW.tmp$WarLocationCountry)) と関係があると思いますが、CoW.tmp$war.start に依存させる方法がわかりませんでした。

2) geom_text は、geom_segments の隣に推定死傷者数 (sum.deaths; 数値) を追加します。これらの推定値には、いくつかの NA / 欠損データが含まれています。それらをNAとして保持するたびに、次のエラーメッセージが表示されます。エラー: 'x' and 'units' must have length > 0; geom_text の部分に na.rm=TRUE を追加すれば解決すると思っていたのですが、残念ながらそうではありません。

現在、不足しているデータは 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
))
4

1 に答える 1

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因子のレベルをその順序にリセットすることだと思います (コードの最初の 2 行)。単項マイナスは日付では機能しないため-war.start、関数の呼び出しでは使用できません。これは、1970 年 1 月 1 日からの日数を表す整数を返します。これは逆にすることができます。order(...)-as.integer(war.start)

これでも部分的な解決策にすぎません。あなたのデータセットには、重複したレコードがいくつかあるようです (第二次ソマリア戦争は、他のいくつかのレコードと同様に複数回そこにあるようです)。これは、第二次スーダン戦争の最初のインスタンスの後、2 番目のインスタンスの前に SPLA 戦争が始まるスーダンの問題を引き起こします。これが、その場合に y 軸が正しく順序付けられない理由です。

ラベルに関する 2 番目の問題は、上記の私のコメントのように解決されます。

legend.box="vertical"SOでうまく表示される画像のために、フォントサイズを微調整して設定したことにも注意してください。PDF やその他の形式にエクスポートする場合は、元に戻す必要があります。

于 2014-07-08T17:13:16.520 に答える