Bagaimana cara mengubah judul legenda di ggplot

300

Saya memiliki plot berikut seperti di bawah ini. Itu dibuat dengan perintah ini:

library(ggplot2)

df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), 
                 rating = c(rnorm(200), rnorm(200, mean=.8)))

ggplot(df, aes(x=rating, fill=cond)) + 
geom_density(alpha = .3) +
xlab("NEW RATING TITLE") +
ylab("NEW DENSITY TITLE")

Sekarang hal berikutnya yang ingin saya lakukan adalah mengubah judul legenda dari cond ke NEW LEGEND TITLE .

Jadi yang saya lakukan adalah menambahkan baris berikut, tambahkan akhir kode di atas:

+labs(colour="NEW LEGEND TITLE")

Tapi itu tidak berhasil. Apa cara yang benar untuk melakukannya?

masukkan deskripsi gambar di sini

neversaint
sumber
110
labs(fill="xyz")harus dilakukan
baptiste
1
@aptapte Saya sudah kembali ke pertanyaan ini berkali-kali tanpa memperhatikan komentar Anda, bisakah Anda menuliskannya sebagai jawaban? IMO itu solusi paling sederhana dan patut dikenali
User632716
3
@ User632716 ini sudah ada dalam jawaban seseorang di bawah ini
baptiste
7
itu tidak bekerja ...
shenglih
1
Bagi mereka yang mencari jawaban yang melibatkan plot dengan banyak geom_pernyataan, saya merekomendasikan jawabannya di stackoverflow.com/a/38485985/1169233 , itu satu-satunya yang bekerja untuk saya.
Waldir Leoncio

Jawaban:

348

Ini seharusnya bekerja:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
p <- p + guides(fill=guide_legend(title="New Legend Title"))

(atau sebagai alternatif)

p + scale_fill_discrete(name = "New Legend Title")
Arun
sumber
10
Alternatif lain adalahp$labels$fill <- "New Legend Title"
Alex Holcombe
3
apa perbedaan antara pemandu dan scale_fill_discrete
Medhat
18
p$labels$filltidak bekerja untuk saya. Dengan ggplot2_2.1.0saya menggunakanp$labels$colour <- "New legend title"
ClementWalter
4
p$labels$fill bagus tetapi jika Anda menggunakan lebih dari satu variabel dalam estetika (linetype, warna, bentuk) di aes, Anda harus mengubahnya untuk masing-masing secara terpisah.
Disiplin
226

Saya tidak menggali banyak tentang ini tetapi karena Anda menggunakan fill = cond in ggplot (),

 + labs(color='NEW LEGEND TITLE') 

mungkin tidak berhasil. Namun jika Anda mengganti warna dengan isi , itu berfungsi!

+ labs(fill='NEW LEGEND TITLE') 

Ini bekerja untuk saya di ggplot2_2.1.0

Rohan Sadale
sumber
20
Saya pikir ini adalah jawaban yang paling keras, ia melakukan persis apa yang diminta OP dengan satu baris ekstra paling banyak
Leo
3
baik color = dan fill = harus berfungsi. Ini adalah jawaban "benar" untuk pertanyaan, IMO
Dan
3
apakah warna isi akan berfungsi tergantung pada "cond" (atau kelompok dalam kasus lain) apa yang benar-benar dipetakan. Penjelasan yang baik dapat ditemukan di cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363
3
Ini jawaban terbaik.
Akshay Gaur
1
Catatan: di ggplot2 3.0+ solusi ini tidak berfungsi: dipecahkan olehp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus
39

Karena Anda memiliki dua kerapatan, saya bayangkan Anda mungkin ingin mengatur warna Anda sendiri scale_fill_manual.

Jika demikian, Anda dapat melakukannya:

df <- data.frame(x=1:10,group=c(rep("a",5),rep("b",5)))

legend_title <- "OMG My Title"

ggplot(df, aes(x=x, fill=group)) + geom_density(alpha=.3) +   
    scale_fill_manual(legend_title,values=c("orange","red"))

masukkan deskripsi gambar di sini

user1317221_G
sumber
27

Tidak satu pun dari kode di atas bekerja untuk saya.

Inilah yang saya temukan dan berhasil.

labs(color = "sale year")

Anda juga dapat memberi ruang antara judul dan tampilan dengan menambahkan \ndi bagian akhir.

labs(color = 'sale year\n")

Rohit Yadav
sumber
2
Bagaimana ini berbeda dari jawaban ini ?
merv
3
Yap, saya mencoba setiap contoh di atas dan ini adalah satu-satunya yang bekerja untuk saya. Terima kasih!
SummerEla
Bagaimana cara ini bekerja diberikan pertanyaan posting asli, tampaknya fillbukannya color(atau colour) diperlukan? Mengingat waktu pertanyaan, mungkin itu ggplot2terkait versi.
steveb
1
@erv Perbedaan utama adalah bahwa ini benar-benar berfungsi.
Luís de Sousa
16

Karena dalam kode yang Anda gunakan ggplot(data, fill= cond)untuk membuat histogram Anda perlu menambahkan judul legenda dengan juga menggunakan "isi" di bagian label yaitu +labs(fill="Title name"). Jika Anda menggunakan tipe plot yang berbeda dengan kode ggplot (data, color = cond), maka Anda dapat menggunakannya +labs(colour= "Title Name"). Singkatnya, argumen lab harus cocok dengan argumen aes.

Saya telah terbiasa + guides(fill=guide_legend("my awesome title"))mengubah judul legenda pada plot geom_bar tetapi sepertinya tidak berhasil untuk geom_point.

kulianne
sumber
..., tetapi untuk geom_point(), ini bekerja untuk saya:guides(color=guide_legend("Type:"))
knb
1
@knb, metode Anda berfungsi:guides(color=guide_legend("Score Ranking:"))
bmc
1
Bagaimana ini berbeda dari jawaban ini ?
merv
6

Ada jawaban lain yang sangat sederhana yang dapat bekerja untuk beberapa grafik sederhana.

Cukup tambahkan panggilan ke guide_legend () ke dalam grafik Anda.

ggplot(...) + ... + guide_legend(title="my awesome title")

Seperti yang ditunjukkan dalam dokumen ggplot yang sangat bagus .

Jika itu tidak berhasil, Anda dapat mengatur parameter panduan dengan panggilan ke panduan :

ggplot(...) + ... + guides(fill=guide_legend("my awesome title"))

Anda juga dapat memvariasikan bentuk / warna / ukuran dengan menentukan parameter ini untuk panggilan Anda guidesjuga.

Palmu
sumber
26
Ini tidak berhasil untuk saya, tetapi qplot(…) + guides(color=guide_legend(title="sale year"))berhasil
Arnaud A
3

Hanya untuk menambah daftar (opsi lain di sini tidak bekerja untuk saya), Anda juga dapat menggunakan fungsi update_labels untuk ggplot:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
update_labels(p, list(colour="MY NEW LEGEND TITLE")

Ini juga akan memungkinkan Anda untuk mengubah label sumbu x dan y, dengan baris terpisah:

update_labels(p, list(x="NEW X LABEL",y="NEW Y LABEL")
pengguna3791304
sumber
2

Saya perhatikan ada dua cara untuk mengubah / menentukan legend.title untuk ggboxplot ():

library(ggpubr)

bxp.defaultLegend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                               color = "dose", palette = "jco")

# Solution 1, setup legend.title directly in ggboxplot()
bxp.legend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                 color = "dose", palette = "jco", legend.title="Dose (mg)")

# Solution 2: Change legend title and appearnace in ggboxplot() using labs() and theme() option:
plot1 <-  bxp.defaultLegend + labs(color = "Dose (mg)") +
  theme(legend.title = element_text(color = "blue", size = 10), legend.text = element_text(color = "red"))

ggarrange(list(bxp.legend, bxp.defaultLegend, plot1), nrow = 1, ncol = 3,  common.legend = TRUE)

Kode diubah berdasarkan contoh dari GitHub .

Niat Baik
sumber
1

Saya menggunakan facet_wrap di ggplot saya dan tidak ada solusi yang disarankan yang bekerja untuk saya kecuali solusi ArnaudA:

qplot() + guides(color=guide_legend(title="sale year")) 
Burung di atas kabel
sumber
1

Banyak orang menghabiskan banyak waktu mengganti label, label legenda, judul, dan nama sumbu karena mereka tidak tahu bahwa mungkin untuk memuat tabel di R yang berisi spasi " ". Namun Anda dapat melakukan ini untuk menghemat waktu atau mengurangi ukuran kode Anda, dengan menentukan pemisah saat Anda memuat tabel yang misalnya dibatasi dengan tab (atau pemisah lain selain standar atau satu ruang tunggal):

read.table(sep = '\t')

atau dengan menggunakan parameter pemuatan default format csv:

read.csv()

Ini berarti Anda dapat secara langsung menyimpan nama "NEW LEGEND TITLE"sebagai nama kolom (header) dalam file data asli Anda untuk menghindari menentukan judul legenda baru di setiap plot.

Nakx
sumber
-1

ggplot(df) + labs(legend = '<legend_title>')

Matthew Park
sumber