21

ggplot を使用してファセット円グラフを作成しようとしていますが、各スライスの中央にテキストを配置する際に問題に直面しています。

dat = read.table(text = "Channel Volume Cnt
                         AGENT   high   8344
                         AGENT medium   5448
                         AGENT    low  23823
                         KIOSK   high  19275
                         KIOSK medium  13554
                         KIOSK    low  38293", header=TRUE)

vis = ggplot(data=dat, aes(x=factor(1), y=Cnt, fill=Volume)) +
  geom_bar(stat="identity", position="fill") +
  coord_polar(theta="y") +
  facet_grid(Channel~.) +
  geom_text(aes(x=factor(1), y=Cnt, label=Cnt, ymax=Cnt), 
            position=position_fill(width=1))

出力: ここに画像の説明を入力

geom_text円グラフ スライスの中央に数値ラベルを配置するには、どのパラメータを調整する必要がありますか?

関連する質問は、円グラフがテキストを重ね合わせていることですが、ファセットで大文字と小文字を区別しません。

更新: 上記の質問の Paul Hiemstra のアドバイスとアプローチに従って、コードを次のように変更しました。

---> pie_text = dat$Cnt/2 + c(0,cumsum(dat$Cnt)[-length(dat$Cnt)])

     vis = ggplot(data=dat, aes(x=factor(1), y=Cnt, fill=Volume)) +
     geom_bar(stat="identity", position="fill") +
     coord_polar(theta="y") +
     facet_grid(Channel~.) +
     geom_text(aes(x=factor(1), 
--->               y=pie_text, 
                   label=Cnt, ymax=Cnt), position=position_fill(width=1))

私が予想したように、テキスト座標の微調整は絶対ですが、ファセット データ内にある必要があります。 ここに画像の説明を入力

4

4 に答える 4

45

新しい回答: ggplot2 v2.2.0の導入により、position_stack()最初に位置変数を計算する必要なく、ラベルを配置するために使用できます。次のコードでは、古い回答と同じ結果が得られます。

ggplot(data = dat, aes(x = "", y = Cnt, fill = Volume)) + 
  geom_bar(stat = "identity") +
  geom_text(aes(label = Cnt), position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y") +
  facet_grid(Channel ~ ., scales = "free")

「中空」の中心を削除するには、コードを次のように調整します。

ggplot(data = dat, aes(x = 0, y = Cnt, fill = Volume)) + 
  geom_bar(stat = "identity") +
  geom_text(aes(label = Cnt), position = position_stack(vjust = 0.5)) +
  scale_x_continuous(expand = c(0,0)) +
  coord_polar(theta = "y") +
  facet_grid(Channel ~ ., scales = "free")

古い答え:この問題の解決策は、位置変数を作成することです。これは、ベース R またはdata.tableplyrまたはdplyrパッケージを使用して非常に簡単に実行できます。

ステップ 1:各チャネルの位置変数を作成する

# with base R
dat$pos <- with(dat, ave(Cnt, Channel, FUN = function(x) cumsum(x) - 0.5*x))

# with the data.table package
library(data.table)
setDT(dat)
dat <- dat[, pos:=cumsum(Cnt)-0.5*Cnt, by="Channel"]

# with the plyr package
library(plyr)
dat <- ddply(dat, .(Channel), transform, pos=cumsum(Cnt)-0.5*Cnt)

# with the dplyr package
library(dplyr)
dat <- dat %>% group_by(Channel) %>% mutate(pos=cumsum(Cnt)-0.5*Cnt)

ステップ 2:ファセット プロットの作成

library(ggplot2)
ggplot(data = dat) + 
  geom_bar(aes(x = "", y = Cnt, fill = Volume), stat = "identity") +
  geom_text(aes(x = "", y = pos, label = Cnt)) +
  coord_polar(theta = "y") +
  facet_grid(Channel ~ ., scales = "free") 

結果:

ここに画像の説明を入力

于 2014-04-02T07:29:42.510 に答える
5

座標に対するラベル テキストの位置を微調整するには、 のvjustおよびhjust引数を使用できますgeom_text。これにより、すべてのラベルの位置が同時に決定されるため、これは必要ない場合があります。

または、ラベルの座標を微調整することもできます。座標 ( ) をdata.frame平均して、その特定の円の中心にラベルを配置する新しい場所を定義します。元の の代わりに、これを newに渡すだけです。Cntlabel_x[i] = Cnt[i+1] + Cnt[i]data.framegeom_textdata.frame

さらに、円グラフにはいくつかの視覚的な解釈上の欠陥があります。一般に、特にドットプロットなどの適切な代替手段が存在する場合は、それらを使用しません。

ggplot(dat, aes(x = Cnt, y = Volume)) + 
  geom_point() + 
  facet_wrap(~ Channel, ncol = 1)

たとえば、このプロットからCnt、Agent よりも Kiosk の方が高いことが明らかですが、この情報は円グラフでは失われています。

ここに画像の説明を入力

于 2013-04-24T05:50:00.440 に答える
0

次の回答は部分的で不格好なので、受け入れません。それがより良い解決策を求めることを願っています。

text_KIOSK = dat$Cnt
text_AGENT = dat$Cnt
text_KIOSK[dat$Channel=='AGENT'] = 0
text_AGENT[dat$Channel=='KIOSK'] = 0
text_KIOSK = text_KIOSK/1.7 + c(0,cumsum(text_KIOSK)[-length(dat$Cnt)])
text_AGENT = text_AGENT/1.7 + c(0,cumsum(text_AGENT)[-length(dat$Cnt)])
text_KIOSK[dat$Channel=='AGENT'] = 0
text_AGENT[dat$Channel=='KIOSK'] = 0
pie_text = text_KIOSK + text_AGENT


vis = ggplot(data=dat, aes(x=factor(1), y=Cnt, fill=Volume)) +
  geom_bar(stat="identity", position=position_fill(width=1)) +
  coord_polar(theta="y") +
  facet_grid(Channel~.) +
  geom_text(aes(y=pie_text, label=format(Cnt,format="d",big.mark=','), ymax=Inf), position=position_fill(width=1))

次のチャートを生成します。 ここに画像の説明を入力

お気づきのように、緑 (低) のラベルを移動することはできません。

于 2013-04-24T15:59:49.470 に答える