Hapus legenda ggplot 2.2

250

Saya mencoba untuk menjaga legenda satu lapisan (halus) dan menghapus legenda yang lain (titik). Saya telah mencoba mematikan legenda dengan guides(colour = FALSE)dan geom_point(aes(color = vs), show.legend = FALSE).

Sunting : Karena pertanyaan ini dan jawabannya populer, contoh yang direproduksi tampaknya berurutan:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

masukkan deskripsi gambar di sini

Orang
sumber
5
Contoh yang direproduksi minimal akan jauh lebih sederhana. Pada baris kode yang panjang tampaknya ada banyak kode yang tidak perlu (untuk masalah yang ada) dan juga sama sekali tidak dapat diproduksi kembali seperti saat ini ditulis.
mnel
Kemungkinan duplikat Mematikan beberapa legenda di ggplot
Umaomamaomao

Jawaban:

445

dari r cookbook , di mana bp adalah ggplot Anda:

Hapus legenda untuk estetika tertentu (isi):

bp + guides(fill=FALSE)

Ini juga dapat dilakukan saat menentukan skala:

bp + scale_fill_discrete(guide=FALSE)

Ini menghapus semua legenda:

bp + theme(legend.position="none")
pengguna3490026
sumber
25
Sebagai balasan untuk komentar oleh @Alex: Catatan yang theme_bw()dapat mengganggu definisi apa pun yang dilakukan theme(). Saat menggunakan theme_bw(), pastikan untuk menambahkannya ke plot sebelum Anda mengubah opsi tema lainnya.
fabern
1
tetapi ketika saya melakukan sesuatu seperti ini bp + theme(legend.position="none") + theme_classic(), legenda kembali. Jadi bagaimana cara menghapusnya?
loveR
3
@loveR menempatkan theme_classic pertama:bp + theme_classic() + theme(legend.position="none")
hipotesis
1
Ini tidak berpengaruh pada plot saya. Saya menggunakan pendekatan @Tjebo dengan sukses.
James Hirschorn
80

Mungkin ada solusi lain untuk ini:
Kode Anda adalah:

geom_point(aes(..., show.legend = FALSE))

Anda dapat menentukan show.legendparameter setelah itu aespanggilan:

geom_point(aes(...), show.legend = FALSE)

maka legenda yang sesuai akan hilang

Tjebo
sumber
3
Ini adalah pendekatan yang sangat bagus. Lebih intuitif juga.
pat
2
Ini adalah solusi yang berfungsi untuk menghapus surat dari legenda ketika saya menggunakan geom_text untuk membubuhi keterangan garis warna. Tidak ada scale_labelperintah (juga tidak masuk akal), dan guide(label = FALSE)juga tidak berhasil. Terima kasih!
Melissa Key
45

Karena pertanyaan dan jawaban user3490026 adalah hit pencarian teratas, saya telah membuat contoh yang dapat direproduksi dan ilustrasi singkat dari saran yang dibuat sejauh ini, bersama dengan solusi yang secara eksplisit menjawab pertanyaan OP.

Salah satu hal yang ggplot2dilakukan dan yang dapat membingungkan adalah bahwa ia secara otomatis memadukan legenda tertentu ketika mereka dikaitkan dengan variabel yang sama. Misalnya, factor(gear)muncul dua kali, sekali untuk linetypedan sekali untuk fill, menghasilkan legenda gabungan. Sebaliknya, gearmemiliki entri legenda sendiri karena tidak diperlakukan sama seperti factor(gear). Solusi yang ditawarkan sejauh ini biasanya bekerja dengan baik. Tetapi kadang-kadang, Anda mungkin perlu mengganti panduan. Lihat contoh terakhir saya di bagian bawah.

# reproducible example:
library(ggplot2)
p <- ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

masukkan deskripsi gambar di sini

Hapus semua legenda: @ user3490026

p + theme(legend.position = "none")

Hapus semua legenda: @duhaime

p + guides(fill = FALSE, color = FALSE, linetype = FALSE, shape = FALSE)

Matikan legenda: @Tjebo

ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs), show.legend = FALSE) +
geom_point(aes(shape = factor(cyl)), show.legend = FALSE) +
geom_line(aes(linetype = factor(gear)), show.legend = FALSE) +
geom_smooth(aes(fill = factor(gear), color = gear), show.legend = FALSE) + 
theme_bw() 

Hapus isian agar linetype menjadi terlihat

p + guides(fill = FALSE)

Sama seperti di atas melalui fungsi scale_fill_:

p + scale_fill_discrete(guide = FALSE)

Dan sekarang satu jawaban yang mungkin untuk permintaan OP

"untuk menjaga legenda satu lapisan (halus) dan menghapus legenda lainnya (titik)"

Matikan beberapa dari ad-hoc post-hoc

p + guides(fill = guide_legend(override.aes = list(color = NA)), 
           color = FALSE, 
           shape = FALSE)  

masukkan deskripsi gambar di sini

PatrickT
sumber
2
Hanya perhatikan warna isian biru di plot terakhir tidak muncul pada grafik, tidak yakin mengapa ...
PatrickT
Ketik warnings()setelah Anda menjalankan kode Anda dan Anda akan melihat alasan pita biru tidak muncul.
Markus
@markus: Terima kasih, terima kasih! Saya tidak akan repot-repot mengedit contohnya, karena masalahnya terpisah. Namun, tidak masuk akal untuk memiliki legenda seketika itu tidak dihitung. Mungkin bernilai masalah di github, tapi aku tidak punya energi sekarang ...
PatrickT
13

Jika grafik Anda menggunakan keduanya filldan colorestetika, Anda dapat menghapus legenda dengan:

+ guides(fill=FALSE, color=FALSE)
duhaime
sumber