0

パーセンテージのデータがあります。ggplot を使用してグラフを作成したいのですが、思い通りに動作させることができません。データは非常に歪んでいるため、単純な積み上げ列はうまく機能しません。非常に小さな値が表示されないためです。サンプル セットは次のとおりです。

    Actual  Predicted
a   0.5     5
b   9.5     5
c   90      90

左がエクセルプロット、右がR-ggplot

エクセルプロット

問題は、R では列が積み重なって偶数にならないことです。

ここに私のRコードがあります:

a = c("a","b","c","a","b","c")
b = c("Actual","Actual","Actual","Predicted","Predicted","Predicted")
c = c(0.5,2.5,97,0.2,2.2,97.6)
c = c+1

dat = data.frame(Type=a, Case=b, Percentage=c)
ggplot(dat, aes(x=Case, y=Percentage, fill=Type)) + geom_bar(stat="identity") + scale_y_log10()

*Excel と RI の両方で、数値 0 ~ 1 を処理するために +1 を実行するため、y 軸がわずかにずれています。

私が使用する場合:

ggplot(dat, aes(x=Case, y=Percentage, fill=Type)) + geom_bar(stat="identity",position = "fill") + scale_y_log10()

全体の高さは一致していますが、2 つの青い部分のサイズが一致していません (両方とも 90% です)。

ここに画像の説明を入力

4

2 に答える 2

5

2 つの数値の合計が同じ値 (この場合は 103) になるからといって、ログの合計が同じ値になるわけではありません。「塗りつぶし」なしでバーを積み重ねると、値の対数の合計が異なるため、バーの高さが異なります。次に、すべてを同じ高さにスケーリングすると、青いボックスを異なる比率で押しつぶす必要があるため、見た目が異なります。

Excel の棒グラフは意図的に誤解を招きます。左の赤いバーは、その上の青いバーと同じサイズですが、青いバーの約 10 分の 1 の値を表しています。プロポーションの対数スケールで棒グラフを作成することはできません-それは間違っています。

小さな数字を失うことも、誤解を招くこともなく表示する素晴らしい方法があります。「表に数字を書く」という驚くべき視覚化テクニックです。

于 2013-09-06T06:59:24.423 に答える
1

エクセルのように動かすことができました。Spacedman が言ったように、プロットは視覚的に誤解を招きますが、数値的には正しいです。その理由は、y 軸の開始値と終了値を数値的に確認する必要がある場合に、バー セグメントの実際の高さを比較したいからです。Y 軸の最小値がゼロでない棒グラフに似ています。ここにがあります。

データを視覚化するためにこの方法を使用するかどうかはわかりませんが、それを理解しなければなりませんでした。

結果は次のとおりです。

ここに画像の説明を入力

これがコードです(ggplotでy値を割り当てるときに呼び出すことができる関数としてクリーンアップする場合があります)。

a = c("a","b","c","a","b","c")
b = c("Actual","Actual","Actual","Predicted","Predicted","Predicted")
c = c(0.5,9.5,90,5,5,90)
c = c+1
dat = data.frame(Type=a, Case=b, Percentage=c, Cumsum_L=c, Cumsum=c, Norm=c)
for(i in 1:length(dat$Percentage)){
    cumsum=0
    for(j in 1:i){
        if(dat$Case[j]==dat$Case[i]){
            cumsum=cumsum+(dat$Percentage[j])
        }
    }
    dat$Cumsum_L[i]=cumsum-dat$Percentage[i]
    dat$Cumsum[i]=cumsum
    if(dat$Cumsum_L[i]==0){
        dat$Cumsum_L[i]=1
    }
    dat$Norm[i] = log(dat$Cumsum[i])-log(dat$Cumsum_L[i])
}
intervals = seq(from = 0, to = 100, by = 10)
intervals_log = log(intervals)
intervals_log[1]=0

ggplot(dat, aes(x=Case, y=Norm, fill=Type)) + geom_bar(stat="identity") +
    scale_y_continuous(name="Percent",breaks = intervals_log, labels=intervals )

*エンドポイントも修正する必要があります+1ちょっと。

**私も数学をぶち壊しているかもしれません。

于 2013-09-07T02:38:26.573 に答える