Подтвердить что ты не робот

Ggplot Диаграмма пончика

Привет, я действительно очень сильно искал это без всякой радости. Был бы рад получить ссылку на веб-сайт, если он существует. Я изо всех сил пытаюсь понять документацию Хэдли о полярных координатах, и я знаю, что диаграммы пирога/пончика считаются неотъемлемо злыми.

Тем не менее, я пытаюсь сделать это

  • Создайте карту пончика/кольца (так что пирог с пустой серединой), как диаграмма звонка tikz, показанная здесь.
  • Добавьте второй слой сверху (с alpha=0.5 или около того), который показывает вторую (сравнимую) переменную.

Почему? Я хочу показать финансовую информацию. Первое кольцо - это затраты (с разбивкой), а второй - общий доход. Идея заключается в том, чтобы добавить + facet=period за каждый период обзора, чтобы показать тенденцию как в доходах, так и в расходах, а также в обоих.

Любые мысли были бы наиболее оценены

Примечание. Полностью произвольно, если требуется MWE, если это было проверено с помощью

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

Это будет похоже на то, что я пытаюсь сделать. Спасибо

4b9b3361

Ответ 1

У меня нет полного ответа на ваш вопрос, но я могу предложить некоторый код, который может помочь вам начать создавать графические фрагменты с помощью 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

Мысли:

  • Вы можете получить более полезные ответы, если вы разместите некоторые хорошо структурированные образцы данных. Вы указали, что используете некоторые столбцы из набора данных iris (хороший старт), но я не могу понять, как использовать эти данные для создания кольцевого графика. Например, связанный фрагмент звонка показывает пропорции нескольких категорий, но ни iris[, 2:4], ни iris[, 1] не являются категориальными.
  • Вы хотите "Добавить кружок второго слоя сверху": вы хотите наложить второе кольцо непосредственно поверх первого? Или вы хотите, чтобы второе кольцо было внутри или снаружи первого? Вы можете добавить второе внутреннее кольцо с чем-то вроде geom_rect(data=dat2, xmax=3, xmin=2, aes(ymax=ymax, ymin=ymin))
  • Если ваш data.frame имеет столбец с именем period, вы можете использовать facet_wrap(~ period) для фасетирования.
  • Чтобы использовать ggplot2 наиболее легко, вам понадобятся ваши данные в форме "long-form"; melt() из пакета reshape2 может быть полезен для преобразования данных.
  • Сделайте несколько штрих-кодов для сравнения, даже если вы решите не использовать их. Например, попробуйте:   ggplot(dat, aes(x=category, y=count, fill=category)) + geom_bar(stat="identity")

Ответ 2

Просто пытаюсь решить вопрос 2 с тем же подходом из bdemarest answer. Также используя его код как эшафот. Я добавил несколько тестов, чтобы сделать их более полными, но не стесняйтесь их удалять.

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