Изменение радиуса координат_полярного ggplot

Я хочу уменьшить радиус отображения круговой диаграммы, встроенной в ggplot2, относительно остальной части графика (поскольку значения по умолчанию продолжают обрезать метки моей категории).

Вот некоторые фиктивные данные и код, которые должны показать вам, что я испытываю:

library(ggplot2)
library(scales)
library(grid)

Region <- c("North America", "Central America", "South America", "Carribbean",
            "Western Africa", "Northern Africa", "Southern Afica", "Eastern Africa")
Conti <- c(rep("Americas",4), rep("Africa",4))
Freq <- c(runif(8, 1, 100))
Pct <- c(Freq/sum(Freq))
Pos <- c(cumsum(360*Pct)-(360*Pct/2))
Pos <- c(ifelse(Pos<=180,Pos,Pos-180))
df <- data.frame(Region, Conti, Freq, Pct, Pos)

pl <- ggplot(df, aes(x="", y=Freq, fill=Conti)) +
  geom_bar(stat="identity", color="black", width=1) +
  coord_polar(theta='y') +
  guides(fill=guide_legend(override.aes=list(colour=NA))) +
  theme(axis.line = element_blank(),
        axis.ticks=element_blank(),
        axis.title=element_blank(),
        axis.text.y=element_blank(),
        axis.text.x=element_text(color='black', size=18, angle=90-df$Pos),
        panel.background = element_blank(),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.margin = unit(0, "lines"),
        plot.background = element_rect(fill = "white"),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        legend.position = "none") +
  scale_y_continuous(
    breaks=cumsum(df$Freq) - df$Freq/2,
    labels=paste0(df$Region," ",percent(df$Pct)))

print(pl)

Если я уменьшу размер ярлыков, они станут неразборчивыми относительно пирога, а если я увеличу их, они будут обрезаны. Независимо от того, как я пытаюсь настроить aes (), пределы, panel.margin и т. Д., Чтобы получить правильный баланс, ggplot2 автоматически изменяет размер круга, чтобы занимать те же радиусы.

В идеале я бы хотел уменьшить размер пирога вдвое, чтобы освободить место для надписей.

Я ценю, что это не самый красивый сюжет, однако я обновляю старую фигуру, поэтому мне нужно сохранить формат для сравнения. Любые предложения будут оценены.

4 голоса | спросил AJD 9 TueEurope/Moscow2014-12-09T10:21:00+03:00Europe/Moscow12bEurope/MoscowTue, 09 Dec 2014 10:21:00 +0300 2014, 10:21:00

2 ответа


0

Несколько месяцев спустя я обнаружил, что ответ заключается в использовании числового фиктивного значения для X (а не нулевого значения "") и последующем добавлении пределов, превышающих x, к фиктивной оси x. Код, как показано ниже.

Затем возникает проблема с настройкой меток осей в соответствии с новым радиусом в виде hjust= и vjust= не похоже на работу с coord_polar().

Для этого я добавил метки как geom_text() и удалил автоматические метки. Это теперь делает то, что мне нужно.

Основные изменения в верхней и нижней строках.

pl <- ggplot(df, aes(x=0.8, y=Freq, fill=Conti)) +
  geom_bar(stat="identity", color="black", width=1) +
  coord_polar(theta='y') +
  geom_text(aes(x=1.65, y=cumsum(df$Freq) - df$Freq/2,
            label=paste0(df$Region," ",percent(df$Pct)),
            angle=90-df$Pos)) +
  guides(fill=guide_legend(override.aes=list(colour=NA))) +
  theme(axis.line = element_blank(),
        axis.ticks=element_blank(),
        axis.title=element_blank(),
        axis.text.y=element_blank(),
        axis.text.x=element_blank(),
        panel.background = element_blank(),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.background = element_rect(fill = "white"),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        legend.position = "none") +
  scale_x_discrete(limits=c(0, 1))

print(pl)
ответил AJD 4 MaramWed, 04 Mar 2015 08:04:32 +03002015-03-04T08:04:32+03:0008 2015, 08:04:32
0

Я бы предложил использовать разрывы строк.

pl <- pl + scale_y_continuous(
  breaks=cumsum(df$Freq) - df$Freq/2,
  labels=paste0(sapply(strsplit(as.character(df$Region), " "), paste, collapse='\n'),
                "\n(", percent(df$Pct), ")"))
ggsave('pie.png', plot=pl, height=15, width=15)

введите описание изображения здесь

ответил shadow 9 TueEurope/Moscow2014-12-09T12:11:37+03:00Europe/Moscow12bEurope/MoscowTue, 09 Dec 2014 12:11:37 +0300 2014, 12:11:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132