Soru Üst üste yığılmış yüzde barchart etiketleri nasıl ortalanır?


Güzel çizmek için çalışıyorum stacked percent barchart kullanma ggplot2. Bazı materyalleri okudum ve neredeyse istediğim şeyi çiziyorum. Ayrıca, malzemeyi kapatıyorum, tek bir yerde yararlı olabilir:

Özet veri çerçevesi oluşturmadan ggplot2'de yığılmış çubuk grafiğini nasıl etiketlerim?

Her yığının% 100'e kadar ölçeklendirildiği yığılmış bir barplot oluşturun.

R yığılmış yüzdelik ikili grafik ve etiket yüzdesi (ggplot ile)

Benim sorunum, yerleştiremem. labels İstediğim yerde - barların ortasında. enter image description here

Yukarıdaki resimde problemi görebilirsiniz - etiketler tam olarak görünüyor ve birbiriyle çakışıyor.

Şu anda aradığım şey şu:

  1. Etiketlerin çubukların ortasına yerleştirilmesi (alanlar)

  2. Tüm etiketler nasıl çizilir, ancak örneğin% 10'dan daha greather olan nedir?

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

İçin Q 1. @MikeWise olası önerdi çözüm. Bununla birlikte, hala bu problemle baş edemiyorum.

Ayrıca, yeniden üretilebilir örneği, bu grafiği nasıl çizdiğimi de ekleyebilirim.

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

18
2018-01-20 14:57


Menşei




Cevaplar:


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

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 ifelse Bir etiketin çizilip çizilmediğini belirten açıklama. Bu durumda,% 7'den daha düşük yüzdeler için bir etiket çizmekten kaçındım.

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

GÜNCELLEŞTİRME: Ggplot2 sürüm 2 ile, metin etiketlerinin koordinatlarını ortalamak için artık gerekli değildir. Bunun yerine kullanabilirsiniz position=position_stack(vjust=0.5). Ö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


27
2018-01-20 15:54



Ek soru. Etiketleri kutulara yerleştirmenin kolay bir yolu var mı? geom_label fonksiyonlar çalışmıyor gibi görünüyor. Bu bağlantı de yardım etme. Yol gerçekten karmaşık görünüyor - AK47
Yeni yapı ile bunun nasıl gerçekleştirileceğine dair herhangi bir düşünce var mı? Bu sayfadaki son "Cevap", etiketlerin ters sırada yerleştirildiği yerdeki benzer bir sorunu gösterir. Bu yöntemi aylarca başarıyla kullandım. - Richard Lusch
Cevabım için güncellemeye bakın. - eipi10
Bu çok havalı. Paylaştığın için teşekkürler! - Bajcz


Örneği takip ettim ve basit yığılmış çubuklar için güzel etiketlerin nasıl yerleştirileceğini buldum. Ben de yararlı olabileceğini düşünüyorum.

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
2018-01-20 17:01





RSTudio 1.0.44 ve R sürüm 3.3.1 ile macOs Sierra aynı örnek başka bir düzenleme gösterir:

enter image description here


-3
2017-11-13 11:36



İlginç bir şekilde, aynı çözümü son 6 ay boyunca kullandım ve fevkalade çalıştı. Aynı sorunla karşılaştığı en son güncellemelere kadar devam etmedi. Etiketler yüzdesi, olması gereken yerden tersine çevrilir. - Richard Lusch