Ggplot Диаграмма пончика
Привет, я действительно очень сильно искал это без всякой радости. Был бы рад получить ссылку на веб-сайт, если он существует. Я изо всех сил пытаюсь понять документацию Хэдли о полярных координатах, и я знаю, что диаграммы пирога/пончика считаются неотъемлемо злыми.
Тем не менее, я пытаюсь сделать это
- Создайте карту пончика/кольца (так что пирог с пустой серединой), как диаграмма звонка tikz, показанная здесь.
- Добавьте второй слой сверху (с
alpha=0.5
или около того), который показывает вторую (сравнимую) переменную.
Почему? Я хочу показать финансовую информацию. Первое кольцо - это затраты (с разбивкой), а второй - общий доход. Идея заключается в том, чтобы добавить + facet=period
за каждый период обзора, чтобы показать тенденцию как в доходах, так и в расходах, а также в обоих.
Любые мысли были бы наиболее оценены
Примечание. Полностью произвольно, если требуется MWE, если это было проверено с помощью
donut_data=iris[,2:4]
revenue_data=iris[,1]
facet=iris$Species
Это будет похоже на то, что я пытаюсь сделать. Спасибо
Ответы
Ответ 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]()