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.