web-dev-qa-db-ja.com

ggplotドーナツグラフ

こんにちは私は本当に喜びなしでこれをたくさんググった。ウェブサイトが存在する場合は、その参照を取得できれば幸いです。 極座標に関するHadleyのドキュメント を理解するのに苦労しています。パイ/ドーナツチャートは本質的に悪と見なされていることを知っています。

そうは言っても、私がやろうとしているのは

  1. ここに示す tikzリングチャート のようなドーナツ/リングチャート(つまり、真ん中が空のパイ)を作成します
  2. 2番目の(比較可能な)変数を示す2番目のレイヤー円を(alpha=0.5などで)上に追加します。

どうして?財務情報を表示したいと思っています。最初のリングはコスト(内訳)で、2番目のリングは総収入です。次に、レビュー期間ごとに+ facet=periodを追加して、収益と費用の両方の傾向と両方の成長を示すというアイデアです。

どんな考えでも大歓迎です

注:MWEが必要な場合、これを試してみた場合は完全に恣意的に

donut_data=iris[,2:4]
revenue_data=iris[,1]
facet=iris$Species

それは私がやろうとしていることに似ているでしょう..ありがとう

15
Tahnoon Pasha

あなたの質問に対する完全な答えはありませんが、_ggplot2_を使用してリングプロットの作成を開始するのに役立つコードをいくつか提供できます。

_library(ggplot2)

# Create test data.
dat = data.frame(count=c(10, 60, 30), category=c("A", "B", "C"))

# Add addition columns, needed for drawing with geom_rect.
dat$fraction = dat$count / sum(dat$count)
dat = dat[order(dat$fraction), ]
dat$ymax = cumsum(dat$fraction)
dat$ymin = c(0, head(dat$ymax, n=-1))

p1 = ggplot(dat, aes(fill=category, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
     geom_rect() +
     coord_polar(theta="y") +
     xlim(c(0, 4)) +
     labs(title="Basic ring plot")

p2 = ggplot(dat, aes(fill=category, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
     geom_rect(colour="grey30") +
     coord_polar(theta="y") +
     xlim(c(0, 4)) +
     theme_bw() +
     theme(panel.grid=element_blank()) +
     theme(axis.text=element_blank()) +
     theme(axis.ticks=element_blank()) +
     labs(title="Customized ring plot")


library(gridExtra)
png("ring_plots_1.png", height=4, width=8, units="in", res=120)
grid.arrange(p1, p2, nrow=1)
dev.off()
_

enter image description here

考え:

  1. 適切に構造化されたサンプルデータを投稿すると、より役立つ回答が得られる場合があります。 irisデータセットのいくつかの列を使用することについて言及しましたが(良いスタートです)、そのデータを使用してリングプロットを作成する方法がわかりません。たとえば、リンクしたリングプロットはいくつかのカテゴリの比率を示していますが、_iris[, 2:4]_も_iris[, 1]_もカテゴリカルではありません。
  2. 「上に2番目のレイヤーサークルを追加」したい:2番目のリングを最初のリングの上に直接重ねるという意味ですか?または、2番目のリングを最初のリングの内側または外側にしますか? geom_rect(data=dat2, xmax=3, xmin=2, aes(ymax=ymax, ymin=ymin))のようなもので2番目の内部リングを追加できます
  3. Data.frameにperiodという名前の列がある場合は、ファセットにfacet_wrap(~ period)を使用できます。
  4. _ggplot2_を最も簡単に使用するには、データを「長い形式」にする必要があります。 _reshape2_パッケージのmelt()は、データの変換に役立つ場合があります。
  5. 使用しないことにした場合でも、比較のためにいくつかのバープロットを作成します。たとえば、次のことを試してください。ggplot(dat, aes(x=category, y=count, fill=category)) + geom_bar(stat="identity")
37
bdemarest

bdemarestの答え から同じアプローチで質問2を解決しようとしています。また、彼のコードを足場として使用しています。より完全にするためにいくつかのテストを追加しましたが、自由に削除してください。

library(broom)
library(tidyverse)
# Create test data.
dat = data.frame(count=c(10,60,20,50),
                 ring=c("A", "A","B","B"),
                 category=c("C","D","C","D"))

# compute pvalue
cs.pvalue <- dat %>% spread(value = count,key=category) %>%
  ungroup() %>% select(-ring) %>% 
  chisq.test() %>% tidy()
cs.pvalue <- dat %>% spread(value = count,key=category) %>% 
  select(-ring) %>%
  fisher.test() %>% tidy() %>% full_join(cs.pvalue)

# compute fractions
#dat = dat[order(dat$count), ]
dat %<>% group_by(ring) %>% mutate(fraction = count / sum(count),
                                      ymax = cumsum(fraction),
                                      ymin = c(0,ymax[1:length(ymax)-1]))


# Add x limits
baseNum <- 4
#numCat <- length(unique(dat$ring))
dat$xmax <- as.numeric(dat$ring) + baseNum
dat$xmin = dat$xmax -1


# plot
p2 = ggplot(dat, aes(fill=category,
                     alpha = ring,
                     ymax=ymax, 
                     ymin=ymin, 
                     xmax=xmax, 
                     xmin=xmin)) +
  geom_rect(colour="grey30") +
  coord_polar(theta="y") +
  geom_text(inherit.aes = F,
            x=c(-1,1),
            y=0,
            data = cs.pvalue,aes(label = paste(method,
                                               "\n",
                                               format(p.value,
                                                      scientific = T,
                                                      digits = 2))))+
  xlim(c(0, 6)) +
  theme_bw() +
  theme(panel.grid=element_blank()) +
  theme(axis.text=element_blank()) +
  theme(axis.ticks=element_blank(),
        panel.border = element_blank()) +
  labs(title="Customized ring plot") + 
  scale_fill_brewer(palette = "Set1") +
  scale_alpha_discrete(range = c(0.5,0.9))

p2

そして結果:

Imgur

4
David Mas