it-swarm.dev

Yığılmış yüzde çubuk grafik etiketlerinin ortalanması

stacked percent barchart kullanarak Nice ggplot2 dosyasını çizmeye çalışıyorum. Bazı materyaller okudum ve neredeyse istediğim şeyi çizmeyi başardım. Ayrıca, malzemeyi içine aldım, tek bir yerde faydalı olabilir:

Bir yığın veri grafiğini bir özet veri çerçevesi oluşturmadan ggplot2'de nasıl etiketlerim?

Her yığının% 100 olarak toplanacağı ölçeklenmiş yığılmış barplot oluşturun

R, ikili faktör ve etiketlerin yüzdesiyle birlikte yüzde bar grafiği yığılmış (ggplot ile)

Benim sorunum, barların ortasına, labels istediğim yere yerleştiremem.  enter image description here

Yukarıdaki resimde problemi görebilirsiniz - etiketler çok garip görünüyor ve birbirleriyle örtüşüyorlar.

Şu an aradığım şey:

  1. Etiketleri çubukların ortasına (alanların) içine yerleştirme

  2. Tüm etiketleri değil, örneğin% 10'dan daha büyük olan grafikleri nasıl çizelim?

  3. Örtüşen problemi nasıl çözülür?

Q 1. için @MikeWise mümkün olanı önerdi solution . Ancak, hala bu sorunla baş edemiyorum.

Ayrıca, yeniden üretilebilir örneği, bu grahp'u nasıl çizdiğimi içine alıyorum.

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("")
20
AK47

Etiketlerin nasıl ortalanacağı ve küçük yüzdeler için etiketlerin çizilmemesi. Verilerinizdeki ek bir sorun, her renk için birden çok çubuk bölümünüzün olmasıdır. Bunun yerine, bana verilen renkteki tüm çubuk bölümlerinin birleştirilmesi gerektiği görünüyor. Aşağıdaki kod, çizim için verileri ayarlamak üzere dplyr yerine plyr işlevini kullanır:

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)

Verileri çizmek için, bir etiketin çizilip çizilmediğini belirlemek için bir ifelse deyimi kullanın. Bu durumda,% 7'den az yüzdeler için bir etiket çizmekten kaçınıyorum.

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="")

 enter image description here

UPDATE: ggplot2 sürüm 2 ile, onları ortalamak için metin etiketlerinin koordinatlarını hesaplamak gerekmez. Bunun yerine, position=position_stack(vjust=0.5) işlevini kullanabilirsiniz. Örneğin:

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="")

 enter image description here

30
eipi10

Örneği izledim ve basit yığılmış çubuk çizelgeler için Nice etiketlerinin nasıl yerleştirileceğini buldum. Bence de faydalı olabilir.

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="")

 enter image description here

1
AK47