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

Как центрировать наложенные процентные метки штрих-кода

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

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

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

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

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

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

Сейчас я ищу:

  • Как разместить метки в середине экрана (области)

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

  • Как решить совпадающую проблему?

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

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

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("")
4b9b3361

Ответ 1

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

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, чтобы определить, нанесена ли метка или нет. В этом случае я избегал построения метки для процентов менее 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="")

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

Ответ 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="")

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

Ответ 3

Тот же пример в macOs Sierra с RStudio 1.0.44 и R версии 3.3.1 показывает другое расположение:

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