En boy oranı ggplot'ta nasıl düzeltilir?


89

Belgeme sığması için bir grafiği yeniden boyutlandırmaya çalışıyorum, ancak çizilen diyagramın kare olmasını sağlamakta güçlük çekiyorum.

Misal:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

X ve y için sınırlar aynı olsa da, sonuçtaki grafik kare değildir. Sanırım R, çevreleyen paneli 5x5 "yapıyor, ancak gerçek diyagram boyutunu umursamıyor.

Nasıl olabilir unsquash benim diyagramlar?

Yanıtlar:


115

In ggplotsenin komplo boy oranını korumak için mekanizma bir eklemektir coord_fixed()arsa katmanı. Bu, gerçek sınırlayıcı kutunun şekline bakılmaksızın grafiğin en boy oranını koruyacaktır.

(Ayrıca ortaya ggsaveçıkan arsayı pdf(); print(p); dev.off()sıra yerine pdf / png / vb .

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

görüntü açıklamasını buraya girin


3
Ggplot'un neden y ekseni etiketini sola koymakta ısrar ettiğini biliyor musunuz? Bunu nasıl önleyeceğimi bilmek isterim ...
— Chase

@chase Garip bir çözüm, hjustbaşlığın konumunu değiştirmektir - deneyin opts(axis.title.y=theme_text(hjust=10)). Ama ne yazık ki öyle görünmüyor. Bir ggplot posta listesi tartışması ve @ Baptiste'nin yanıtı için groups.google.com/group/ggplot2/browse_thread/thread/… adresine bakın .
— Andrie

3
Bu davranış, geliştirme sürümünde düzeltilmiştir.
— hadley

5
Sorunun daha genel başlığıyla, her iki eksende de aynı limitleri kullanmadığında, oranın nasıl hesaplanacağına (coord_fixed argümanı) ilişkin bilgi de ekleyebilir misiniz?
— htorque

1
@ Htorque'un yorumuna ek olarak; bunun yerine y olarak tanımlanırsa y=runif(100, 0, 50), arsanın yönü artık kare değildir. coord_fixed()her eksenin ölçeğinin sadece göründüğü gibi eşit olmasına neden olur?
— farklı bir ben

80

Belirli bir en-boy oranını sağlamak için, örneğin kare için kullanın theme(aspect.ratio=1).

Andrie'nin cevabı tam resmi vermiyor, çünkü örnek belki de x'in aralığının y'nin aralığına eşit olduğu doğal olmayan veriler sağlıyor. Ancak veriler şunlar olsaydı:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

sonra olay örgüsü şöyle görünür:

görüntü açıklamasını buraya girin

Coord_fixed () işlevi ayrıca eksen oranını ayarlamak için bir argümana sahiptir:

ratio y / x olarak ifade edilen en boy oranı

Böylece arsa aşağıdakilerle kare yapılabilir:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

görüntü açıklamasını buraya girin

Ancak bunu değişkenlerin veya çizim alanının sınırlarıyla ayarlamanız gerekir (bu örneklerde olduğu gibi tüm sınırlar tam sayılarla iyi bir şekilde bölünemez).


13

Tamlık adına: Çok farklı eksen sınırlarını hesaba katmak istiyorsanız:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

Sonuçlanan:


14
bundan nasıl daha iyi plot + theme(aspect.ratio=4/3)? Ggplot birden fazla veri kümesine sahip birden çok katmana sahip olabilir ve eksenler isteğe bağlı genişleme faktörlerine sahip olabilir, bu nedenle bir veri kaynağından y / x oranının hesaplanması oldukça kırılgan görünür.
— baptiste

2
Çünkü bu görünüşe göre kolayca keşfedilemez. Bu, burada üç cevap olduğu gerçeğiyle kanıtlanmıştır, ancak hiçbiri bundan bahsetmez. Bir cevaba koymalısın, kesinlikle daha iyi bir çözüm.
— Graipher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.