Farklı boyut ve renkte bir ggplot2 altyazısı nasıl eklenir?


89

Çökeltme barplotlarını iyileştirmek için ggplot2 kullanıyorum.

İşte başarmak istediğim şeyin tekrarlanabilir bir örneği:

library(ggplot2)
library(gridExtra)
secu <- seq(1, 16, by=2)
melt.d <- data.frame(y=secu, x=LETTERS[1:8])
m <- ggplot(melt.d, aes(x=x, y=y)) +
  geom_bar(fill="darkblue") + 
  labs(x="Weather    stations", y="Accumulated Rainfall [mm]") +
  opts(axis.text.x=theme_text(angle=-45, hjust=0, vjust=1),
       title=expression("Rainfall"), plot.margin = unit(c(1.5, 1, 1, 1), "cm"),
       plot.title = theme_text(size = 25, face = "bold", colour = "black", vjust = 5))
z <- arrangeGrob(m, sub = textGrob("Location", x = 0, hjust = -3.5, vjust = -33, gp = gpar(fontsize = 18, col = "gray40"))) #Or guessing x and y with just option
z

Hjust ve vjust üzerinde ggplot2 üzerinde tahmin sayılarını kullanmaktan nasıl kaçınacağımı bilmiyorum Altyazı koymanın daha iyi bir yolu var mı (yalnızca \ n kullanmak değil, farklı metin rengi ve boyutuna sahip bir altyazı)?

Bir pdf dosyasına sahip olmak için ggsave ile kullanabilmeliyim.

İşte ilgili iki soru:

R'deki çizim alanının dışına dipnot alıntı eklensin mi?

Nasıl bir altyazı ekleyebilirim ve R'deki ggplot grafiklerinin yazı tipi boyutunu nasıl değiştirebilirim?

Herhangi bir yardım için teşekkürler.


Vjust = -33 benim için Linux'ta çalıştı. Denizaltının olay örgüsünün altına inmesi gerektiğini biliyorum, ama istediğimi elde etmenin tek yolu buydu.
01

Bu benim arsa gerçekten küçük hale getirir ve grafiğin altında büyük bir boşluk yaratır nedense
Zazu

2
@hrbrmstr in cevabı bugünlerde
gitmenin

Yanıtlar:


103

En son ggplot2 yapıları (yani, 2.1.0.9000 veya daha yenisi), yerleşik işlevsellik olarak altyazılara ve çizim altı başlıklarına sahiptir. Bu, bunu yapabileceğiniz anlamına gelir:

library(ggplot2) # 2.1.0.9000+ 

secu <- seq(1, 16, by=2)
melt.d <- data.frame(y=secu, x=LETTERS[1:8])

m <-  ggplot(melt.d, aes(x=x, y=y))
m <- m + geom_bar(fill="darkblue", stat="identity")
m <- m + labs(x="Weather    stations", 
              y="Accumulated Rainfall [mm]",
              title="Rainfall",
              subtitle="Location")
m <- m + theme(axis.text.x=element_text(angle=-45, hjust=0, vjust=1)) 
m <- m + theme(plot.title=element_text(size=25, hjust=0.5, face="bold", colour="maroon", vjust=-1))
m <- m + theme(plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="black"))
m

(İşlev (el, elname): "plot.subtitle" geçerli bir tema öğesi adı değil.
Luís de Sousa

1
Lütfen yanıtları okuyun: "en son ggplot2 derlemeleri (yani, 2.1.0.9000 veya daha yenisi)"
hrbrmstr

75

Bu yanıtı göz ggplot2 ardı edin 2.2.0 sürümü başlık ve alt başlık işlevine sahiptir. @ Hrbrmstr'ın aşağıdaki cevabına bakın .


Farklı boyutlar elde etmek için atopan içindeki yuvalanmış işlevleri kullanabilirsiniz expression.

DÜZENLE ggplot2 0.9.3 için güncellenmiş kod

m <-  ggplot(melt.d, aes(x=x, y=y)) + 
     geom_bar(fill="darkblue", stat = "identity") + 
     labs(x="Weather    stations", y="Accumulated Rainfall [mm]") + 
     ggtitle(expression(atop("Rainfall", atop(italic("Location"), "")))) +
     theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
     #plot.margin = unit(c(1.5, 1, 1, 1), "cm"), 
     plot.title = element_text(size = 25, face = "bold", colour = "black", vjust = -1))

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


10
Merhaba, bu harika bir çözüm. Bunu kullanmak ancak yerine istiyoruz atop(italic("Location")I nesneyi istiyorum: atop(italic(my_string_vector). Bunu denedim ama sonra altyazı (my_string_vector) olarak değerlendirildi . Bu ifade, dize değerini kullanmaya nasıl zorlanır ve sağlanan metne tam anlamıyla davranılmaz?
Konrad

1
bquoteyerine kullanmanız gereken değişkenleri kullanmakta sorun yaşıyorsanız expression, buraya
toto_tico

3
@Konrad için kullanım nesneleri değiştirmek expressionile bquoteve nesneleri sarmak .()"sub.title" olarak adlandırılan "main.title" denilen bir nesne ve bir nesne saklanan bir alt yazı için saklanan bir ana başlık için, bu gibi: ggtitle(bquote(atop(.(main.title), atop(italic(.(sub.title)), "")))) Kredi Didzis gider Elferts'in cevabı burada: stackoverflow.com/questions/19957536/…
coip

10

Görünüşe optsgöre ggplot 2 0.9.1 itibariyle kullanımdan kaldırılmıştır ve artık işlevsel değildir. Bu bugün itibariyle son sürümleri ile benim için çalıştı: + ggtitle(expression(atop("Top line", atop(italic("2nd line"), "")))).


Bu, final olmadan da çalışır , ""- bu kısım ne için?
naught101

Beni aşar. Başka bir yerde gördüğüm bir örneği kopyalamış olabilirim.
Aren Cambre

Muhtemelen @ SandyMuspratt'ın yukarıdaki cevabından: P - Şimdi anlıyorum, atop()çubukları olmayan bir kesir gibi bir şey. Yani ikinciyi atop()ilkinin içine koymak size orantılı olarak daha küçük metinle bir alt kesir verir. ""Alt fraksiyonu altına. Gerçi gereksiz gibi görünüyor - belki atop()ikinci parametre için varsayılan boş bir dizeye veya başka bir şeye sahiptir.
naught101

Görünüşe göre SandyMuspratt'ın cevabı, cevabımı gönderdikten sonra benimkine benzer bir kodu yansıtacak şekilde değiştirilmiş. :-)
Aren Cambre

9

gtable'a ekleyip bu şekilde süslü bir başlık yapmak çok zor değil,

library(ggplot2)
library(grid)
library(gridExtra)
library(magrittr)
library(gtable)

p <- ggplot() + 
  theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm"))

lg <- list(textGrob("Rainfall", x=0, hjust=0, 
                    gp = gpar(fontsize=24, fontfamily="Skia", face=2, col="turquoise4")),
               textGrob("location", x=0, hjust=0, 
                        gp = gpar(fontsize=14, fontfamily="Zapfino", fontface=3, col="violetred1")),
           pointsGrob(pch=21, gp=gpar(col=NA, cex=0.5,fill="steelblue")))

margin <- unit(0.2, "line")
tg <- arrangeGrob(grobs=lg, layout_matrix=matrix(c(1,2,3,3), ncol=2),
                  widths = unit.c(grobWidth(lg[[1]]), unit(1,"null")),
                  heights = do.call(unit.c, lapply(lg[c(1,2)], grobHeight)) + margin)

grid.newpage()
ggplotGrob(p) %>%
  gtable_add_rows(sum(tg$heights), 0) %>%
  gtable_add_grob(grobs=tg, t = 1, l = 4)  %>%
  grid.draw()

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


8

Bu sürüm bir gtableişlev kullanır . Başlıkta iki satırlık metne izin verir. Her satırın metni, boyutu, rengi ve yazı tipi yüzü diğerinden bağımsız olarak ayarlanabilir. Bununla birlikte, işlev bir grafiği yalnızca tek bir çizim paneliyle değiştirecektir.

Küçük düzenleme: ggplot2 v2.0.0'a güncelleme

# The original plot
library(ggplot2)

secu <- seq(1, 16, by = 2)
melt.d <- data.frame(y = secu, x = LETTERS[1:8])

m <- ggplot(melt.d, aes(x = x, y = y)) + 
     geom_bar(fill="darkblue", stat = "identity") + 
     labs(x = "Weather    stations", y = "Accumulated Rainfall [mm]") + 
     theme(axis.text.x = element_text(angle = -45, hjust = 0, vjust = 1))


# The function to set text, size, colour, and face
plot.title = function(plot = NULL, text.1 = NULL, text.2 = NULL, 
   size.1 = 12,  size.2 = 12,
   col.1 = "black", col.2 = "black", 
   face.1 = "plain",  face.2 = "plain") {

library(gtable)
library(grid)

gt = ggplotGrob(plot)

text.grob1 = textGrob(text.1, y = unit(.45, "npc"), 
   gp = gpar(fontsize = size.1, col = col.1, fontface = face.1))
text.grob2 = textGrob(text.2,  y = unit(.65, "npc"), 
   gp = gpar(fontsize = size.2, col = col.2, fontface = face.2))

text = matrix(list(text.grob1, text.grob2), nrow = 2)
text = gtable_matrix(name = "title", grobs = text, 
   widths = unit(1, "null"), 
   heights = unit.c(unit(1.1, "grobheight", text.grob1) + unit(0.5, "lines"), unit(1.1,  "grobheight", text.grob2) + unit(0.5, "lines")))

gt = gtable_add_grob(gt, text, t = 2, l = 4)
gt$heights[2] = sum(text$heights)

class(gt) =  c("Title", class(gt))

gt
}

# A print method for the plot
print.Title <- function(x) {
   grid.newpage()   
   grid.draw(x)
}


# Try it out - modify the original plot
p = plot.title(m, "Rainfall", "Location", 
   size.1 = 20, size.2 = 15, 
   col.1 = "red", col.2 = "blue", 
   face.2 = "italic")

p

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


3

Grafiği grid.arrange içine kaydırabilir ve ızgara tabanlı özel bir başlık geçirebilirsiniz,

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

library(ggplot2)
library(gridExtra)

p <- ggplot() + 
  theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm"))

tg <- grobTree(textGrob("Rainfall", y=1, vjust=1, gp = gpar(fontsize=25, face=2, col="black")),
               textGrob("location", y=0, vjust=0, gp = gpar(fontsize=12, face=3, col="grey50")),
               cl="titlegrob")
heightDetails.titlegrob <- function(x) do.call(sum,lapply(x$children, grobHeight))

grid.arrange(p, top = tg)

Ggplot'un mevcut sürümleri, sırasıyla opts ve theme_text yerine theme ve element_text kullanır. Ayrıca, ggplotGrob yaklaşımı gridExtra (gridExtra_0.8.1) ve ggplot2'nin (ggplot2_0.9.3.1) mevcut sürümünde başarısız görünüyor
russellpierce

2

Sandy'nin kodunun "Rainfall" için kalın bir başlık oluşturmadığını fark etmişsinizdir - bunu kalın hale getirme talimatı theme () işlevi yerine atop () işlevi içinde yer almalıdır.

ggplot(melt.d, aes(x=x, y=y)) + 
 geom_bar(fill="darkblue", stat = "identity") + 
 labs(x="Weather    stations", y="Accumulated Rainfall [mm]") + 
 ggtitle(expression(atop(bold("Rainfall"), atop(italic("Location"), "")))) +
 theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1),
 plot.title = element_text(size = 25, colour = "black", vjust = -1))

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

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.