2017-02-08 58 views
5

ggplot2'de coord_fixed() koordinat sistemi, verilerin en boy oranının belirli bir değerde tutulmasını sağlar. Böylece, veri şeklini korumak için panelin şekli değişir. Bu arada coord_flip() arsa eksenlerini değiştirir. Bununla birlikte, ggplot2'deki bir çizim tam olarak bir koordinat sistemine sahip olmalıdır, bu nedenle bu işlevler birleştirilemez.ggplot2: Eksenleri çevirin ve veri en boy oranını koruyun

Sorum şu:

orada x ve y eksenleri ile bir koordinat sisteminde sonuçlanan coord_fixed() ve coord_flip() davranışlarını birleştirmek için bir yol var alışverişinde ve verilerin sabit bir boy oranı mu?

Bu popüler bir soru, ancak yaygın cevap yanlış ise:

çok önerilen cevap theme(aspect.ratio = 1) yerine coord_fixed() birlikte coord_flip() kullanmaktır . Ancak, ggplot2 belgelerine göre, bu ayar "panelin en boy oranı" anlamına gelir. Böylece, panelin şeklini korumak için veriler şekil değiştirecektir.

Bunun, şu anda ggplot2'de bulunmayan bir özellik olduğundan şüpheleniyorum. Ancak daha da önemlisi, bu soruya doğru bir çözüm veya en azından yanıtın belgelenmesi gerektiğini düşünüyorum. Sorunun

Hızlı minimal örnek:

library(ggplot2) 
x <- 1:100; data <- data.frame(x = x, y = x * 2) 
p <- ggplot(data, aes(x, y)) + geom_point() 

p # by default panel and data both fit to device window 
p + coord_fixed() # panel changes shape to maintain shape of data 
p + theme(aspect.ratio = 1) # data changes shape to maintain shape of panel 
p + coord_fixed() + coord_flip() # coord_flip() overwrites coord_fixed() 

# popular suggested answer does not maintain aspect ratio of data: 
p + coord_flip() + theme(aspect.ratio = 1) 

cevap

3

ben theme çözüm gerçekten uygun bir olmadığını kabul edersiniz. Burada arsa nesnesinde saklanan gerçek eksenler aralığından yönünü hesaplayarak programlama yoluyla çalışmak yapan bir çözümdür, ama kod birkaç satır alır:

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')] 
sizes <- sapply(ranges, diff) 
aspect <- sizes[1]/sizes[2] 

p + coord_flip() + theme(aspect.ratio = aspect) 

enter image description here

Herhalde kullanmak çözüm Pratikte, ggstance paketindeki yatay geoms kullanmaktır (bu her zaman mümkün olmayabilir).

Not: Bu sadece eşit çarpımsal extend değişken (yani varsayılan) ile iki sürekli ölçekler için tam doğru cevap verecek.

+0

Şerefe, çözümün şu anda mevcut olan en iyi olduğunu düşünüyorum. (Ama ilk cümleninizle ilgili olarak - 'tema' çözümü yanlıştır, yeterlilik gerekli değildir. Uzamsal verilere bakıyorum ve verilerin gerçek biçiminde gösterilip gösterilmediğini bilmek çok önemlidir. zıt etkiyi ve veriyi daha fazla bozar.) – mb7744

+0

@ mb7744 Sadece _many_ insanlar (ama kesinlikle hepsi değil) orijinal çözümün iyi olduğu gerçeğine atıfta bulunuyordum. Seninle aynı fikirde değilim (bu yüzden soruyu cevapladım). – Axeman

+0

Elbette ama aldığım şey, yalnızca farkı fark etmeyen ve arsalarını yanlış yorumlayan insanlar için iyi olabileceğidir. Bu yüzden SO ile ilgili son iki sorunun yanlış kabul edilmiş cevaplara sahip olduğunu düşünüyorum. Ama bu sadece benim nitpicking. Çözümü takdir ediyorum! – mb7744