r ggplot Как центрировать сложенные процентные метки




r plotly bar chart (2)

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

df <- data.frame(Category, Brand, USD)

# Calculate percentages and label positions
df.summary = df %>% group_by(Brand, Category) %>% 
  summarise(USD = sum(USD)) %>%   # Within each Brand, sum all values in each Category
  mutate( pos = cumsum(USD)-0.5*USD)

ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=USD, fill=Category)) +
  geom_bar(stat='identity',  width = .7, colour="black", lwd=0.1) +
  geom_text(aes(label=ifelse(USD>100,round(USD,0),""),
                y=pos), colour="white") +
  coord_flip()+
  labs(y="", x="")

Я пытаюсь построить хороший stacked percent barchart с использованием ggplot2 . Я прочитал некоторый материал и почти успеваю построить, что я хочу. Также прилагаю материал, он может быть полезен в одном месте:

Как пометить столбчатую диаграмму с накоплением в ggplot2 без создания сводного фрейма данных?

Создайте составной барплот, где каждый стек масштабируется до 100%

R составной процентный столбец с процентами двоичного фактора и меток (с ggplot)

Моя проблема в том, что я не могу размещать labels там, где хочу - в середине полос.

Вы можете увидеть проблему на картинке выше - ярлыки выглядят отлично, а также накладываются друг на друга.

То, что я сейчас ищу, это:

  1. Как разместить метки в середине баров (областей)

  2. Как построить не все метки, но, например, которые больше 10%?

  3. Как решить проблему перекрытия?

Для Q 1. @MikeWise предложил возможное solution . Тем не менее, я до сих пор не могу справиться с этой проблемой.

Кроме того, я прилагаю воспроизводимый пример, как я подготовил этот граф.

library('plyr')
library('ggplot2')
library('scales')
set.seed(1992)
n=68

Category <- sample(c("Black", "Red", "Blue", "Cyna", "Purple"), n, replace = TRUE, prob = NULL)
Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL))
USD <- abs(rnorm(n))*100

df <- data.frame(Category, Brand, USD)

# Calculate the percentages
df = ddply(df, .(Brand), transform, percent = USD/sum(USD) * 100)


# Format the labels and calculate their positions
df = ddply(df, .(Brand), transform, pos = (cumsum(USD) - 0.5 * USD))

#create nice labes
df$label = paste0(sprintf("%.0f", df$percent), "%")  



ggplot(df, aes(x=reorder(Brand,USD,
                              function(x)+sum(x)),  y=percent, fill=Category))+
  geom_bar(position = "fill", stat='identity',  width = .7)+
  geom_text(aes(label=label, ymax=100, ymin=0), vjust=0, hjust=0,color = "white",  position=position_fill())+
  coord_flip()+
  scale_y_continuous(labels = percent_format())+
  ylab("")+
  xlab("")

Вот как центрировать метки и избежать нанесения меток на небольшие проценты. Дополнительной проблемой в ваших данных является то, что у вас есть несколько срезов для каждого цвета. Вместо этого мне кажется, что все секции полос данного цвета должны быть объединены. Код ниже использует dplyr вместо plyr для настройки данных для построения графиков:

library(dplyr)

# Initial data frame   
df <- data.frame(Category, Brand, USD)

# Calculate percentages and label positions
df.summary = df %>% group_by(Brand, Category) %>% 
  summarise(USD = sum(USD)) %>%   # Within each Brand, sum all values in each Category
  mutate(percent = USD/sum(USD),
         pos = cumsum(percent) - 0.5*percent)

Чтобы построить данные, используйте оператор ifelse чтобы определить, ifelse ли метка или нет. В этом случае я избегал нанесения метки для процентов менее 7%.

ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=percent, fill=Category)) +
  geom_bar(stat='identity',  width = .7, colour="black", lwd=0.1) +
  geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),""),
                y=pos), colour="white") +
  coord_flip() +
  scale_y_continuous(labels = percent_format()) +
  labs(y="", x="")

ОБНОВЛЕНИЕ: С ggplot2 версии 2 больше не нужно вычислять координаты текстовых меток, чтобы их центрировать. Вместо этого вы можете использовать position=position_stack(vjust=0.5) . Например:

ggplot(df.summary, aes(x=reorder(Brand, USD, sum), y=percent, fill=Category)) +
  geom_bar(stat="identity", width = .7, colour="black", lwd=0.1) +
  geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),"")),
                position=position_stack(vjust=0.5), colour="white") +
  coord_flip() +
  scale_y_continuous(labels = percent_format()) +
  labs(y="", x="")





labels