annotate () 'de npc birimleri kullan

Sep 04 2020

Bir ggplot nesnem var. İle biraz metin eklemek annotate()istiyorum ve metnin koordinatlarını npc birimlerinde belirtmek istiyorum. Mümkün mü?

Bu minimal örnek, metnin normalde aşağıdakilerle nasıl konumlandırıldığını gösterir annotate():

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + annotate("text", x = 30, y = 4.5, label = "hello")

Ben de aynı etkiyi elde etmek isterdim, ancak xve yyerel koordinatlarda belirtmek yerine, bunları npc koordinatlarıyla belirtmek istiyorum. Bu örneğin amacına uygun olarak, tam olarak tercüme konusunda endişeli değilim x = 30ve y = 4.5NPC birimlerine. Sadece npc birimlerinin kullanılıp kullanılamayacağını bilmek istiyorum annotate().

İlgili iki strateji vardır, ancak bunlar tamamen tatmin edici değildir:

  1. Örneğin npc birimlerini belirterek kullanabilirsiniz grid::textGrob(). Ve daha sonra, @baptiste tarafından verilen cevaptaannotation_custom() olduğu gibi , grob ile yerleştirilebilir . Ancak bu çözüm istediğimden biraz daha külfetli.

  2. "Ggpmisc" paketi şunları içerir geom_text_npc(). Ama henüz çalışmamaktadır ile annotate(). Yani annotate("text_npc", ...)işe yaramıyor gibi görünüyor. [Düzenle: şimdi çalışıyor. Pedro Aphalo'nun aşağıdaki mesajına bakın.]

Ayrıca birçok ilgili gönderi var. Greg Snow, özellikle, pbu görünüm penceresinin boyutlarıyla bir görünüm alanı oluşturmak için ızgaranın kullanılmasını ve ardından bu görünüm alanına ek açıklama eklenmesini önerdi . Ve @teunbrand,p bir "gtable" nesnesine (ile ggplotGrob()) dönüştürmeyi ve ardından bu "gtable" nesnesini çizmeyi içeren bir yöntem önerdi . Bu stratejilerden herhangi biri muhtemelen benim amaçlarıma uyarlanabilir. Ancak npc koordinatlarını kullanmanın daha basit bir yolu var annotate()mı?

Yanıtlar

6 AllanCameron Sep 04 2020 at 20:31

Şahsen, Baptiste'nin yöntemini kullanırdım, ancak onu daha az hantal hale getirmek için özel bir işleve sarılıyordum:

annotate_npc <- function(label, x, y, ...)
{
  ggplot2::annotation_custom(grid::textGrob(
    x = unit(x, "npc"), y = unit(y, "npc"), label = label, ...))
}

Bu, şunları yapmanıza izin verir:

p + annotate_npc("hello", 0.5, 0.5)

Bunun her zaman açıklamanızı çizimdeki her panelin görüntü portunun npc alanına (yani tüm çizim penceresi yerine gri gölgeli alana göre) çizeceğini ve bu da onu fasetler için kullanışlı hale getireceğini unutmayın. Açıklamanızı mutlak npc koordinatlarında çizmek istiyorsanız (böylece panelin görünüm alanının dışında çizim yapma seçeneğiniz vardır), iki seçeneğiniz şunlardır:

  1. coord_cartesian(clip = "off")Kullanmadan önce verilen npc koordinatlarından x, y koordinatlarını kullanarak kırpmayı kapatın ve ters mühendislik yapın annotate. Bu karmaşık ama mümkün
  2. Kullanarak düz çizin grid. Bu çok daha kolaydır, ancak ek açıklamanın grafiğin bir parçası olmaktan ziyade arsa üzerine çizilmesi gerektiğinin dezavantajı vardır. Bunu şu şekilde yapabilirsin:
annotate_npc_abs <- function(label, x, y, ...) 
{
  grid::grid.draw(grid::textGrob(
    label, x = unit(x, "npc"), y = unit(y, "npc"), ...))
}

Ve sözdizimi biraz farklı olacaktır:

p 
annotate_npc_abs("hello", 0.05, 0.75)

1 PedroAphalo Sep 11 2020 at 00:20

'Ggpmisc' (> = 0.3.6) itibarıyla aşağıdaki kod beklendiği gibi çalışır (CRAN'da 2020-09-10 itibariyle).

library(ggpmisc)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
# default justification is "inward"
p + annotate("text_npc", npcx = 0.8, npcy = 0.75, label = "hello")
# same justification as default for "geom_text()"
p + annotate("text_npc", npcx = 0.8, npcy = 0.75, label = "hello",
             hjust = "center", vjust = "middle")