Seperti judulnya: Bagaimana saya bisa membuat plot legenda di luar area plot ketika menggunakan grafis dasar?
Saya berpikir tentang mengutak-atik layout
dan menghasilkan plot kosong hanya berisi legenda, tapi saya akan tertarik dengan cara hanya menggunakan fasilitas grafik dasar dan misalnya, par(mar = )
untuk mendapatkan ruang di sebelah kanan plot untuk legenda.
Berikut sebuah contoh:
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")
legend(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))
menghasilkan:
Tetapi seperti yang saya katakan, saya ingin legenda berada di luar area plot (misalnya, di sebelah kanan grafik / plot).
Jawaban:
Mungkin yang Anda butuhkan adalah
par(xpd=TRUE)
untuk memungkinkan hal-hal yang dapat ditarik di luar wilayah plot. Jadi jika Anda melakukan plot utama denganbty='L'
Anda akan memiliki ruang di sebelah kanan untuk legenda. Biasanya ini akan terpotong ke wilayah plot, tetapi lakukanpar(xpd=TRUE)
dan dengan sedikit penyesuaian Anda bisa mendapatkan legenda sejauh mungkin:sumber
par(xpd=NA)
bahkan lebih kuat (yaitu, plot ke lebih banyak wilayah).par
panggilan terpisah tepat sebelum legenda. Dalam plot saya, saya menggunakanpar(new=T)
beberapa kesempatan lain dan hanya ingin menambahkanxpd
param dalam panggilan yang sama, yang menyebabkan masalah.Tidak ada yang disebutkan menggunakan
inset
nilai negatif untuklegend
. Berikut adalah contoh, di mana legenda berada di sebelah kanan plot, selaras ke atas (menggunakan kata kunci"topright"
).Nilai pertama
inset=c(-0.2,0)
mungkin perlu disesuaikan berdasarkan lebar legenda.sumber
xpd
harus diatur agarTRUE
inset negatif berfungsi. Namun terkadang tidak. Dengan perintah diargs.legend=list(x="bottom", horiz=TRUE, inset=-0.2)
dalam sebuahbarplot(...
sepertinya tidak perluxpd=TRUE
tetapi hanya denganlegend(x="bottom", horiz=TRUE, inset=-0.2)
itu sepertinya perluxpd=TRUE
. Ada wawasan? Saya hanya bingung menyampaikan argumen saya?Solusi lain, selain ondes yang telah disebutkan (menggunakan
layout
ataupar(xpd=TRUE)
) adalah untuk overlay plot Anda dengan plot transparan di seluruh perangkat dan kemudian tambahkan legenda itu.Caranya adalah dengan overlay grafik (kosong) di atas area plot yang lengkap dan menambahkan legenda itu. Kita bisa menggunakan
par(fig=...)
opsi. Pertama kami menginstruksikan R untuk membuat plot baru di seluruh perangkat plot:Pengaturan
oma
danmar
diperlukan karena kami ingin memiliki bagian dalam plot mencakup seluruh perangkat.new=TRUE
diperlukan untuk mencegah R memulai perangkat baru. Kami kemudian dapat menambahkan plot kosong:Dan kami siap menambahkan legenda:
akan menambahkan legenda ke kanan bawah perangkat. Demikian juga, kita dapat menambahkan legenda ke margin atas atau kanan. Satu-satunya hal yang perlu kita pastikan adalah bahwa margin plot asli cukup besar untuk mengakomodasi legenda tersebut.
Menempatkan semua ini dalam suatu fungsi;
Dan sebuah contoh. Pertama buat plot, pastikan kita memiliki cukup ruang di bagian bawah untuk menambahkan legenda:
Lalu tambahkan legenda
Yang menghasilkan:
sumber
Maaf karena menghidupkan kembali utas lama, tetapi saya memiliki masalah yang sama hari ini. Cara paling sederhana yang saya temukan adalah sebagai berikut:
Ditemukan di sini: http://www.harding.edu/fmccown/R/
sumber
Saya suka melakukannya seperti ini:
Satu-satunya penyesuaian yang diperlukan adalah dalam menetapkan margin yang tepat agar cukup lebar untuk mengakomodasi legenda.
Namun, ini juga bisa otomatis:
sumber
Baru-baru ini saya menemukan fungsi yang sangat mudah dan menarik untuk mencetak legenda di luar area plot di mana Anda inginkan.
Buat margin luar di sisi kanan plot.
Buat plot
Tambahkan legenda dan cukup gunakan fungsi locator (1) seperti di bawah ini. Maka Anda harus mengklik di tempat yang Anda inginkan setelah memuat skrip berikut.
Cobalah
sumber
Saya hanya bisa menawarkan contoh solusi tata letak yang sudah ditunjukkan.
sumber
Menambahkan alternatif sederhana lain yang menurut saya cukup elegan.
Plot Anda:
Legenda:
Hasil:
Di sini hanya baris kedua legenda yang ditambahkan ke contoh Anda. Gantinya:
inset=c(0,1)
- Memindahkan legenda dengan sebagian kecil dari wilayah plot ke arah (x, y). Dalam hal ini legenda ada di"bottomright"
posisi. Itu dipindahkan oleh 0 wilayah plot di arah x (jadi tetap di "kanan") dan oleh 1 wilayah plot di arah y (dari bawah ke atas). Dan kebetulan itu muncul tepat di atas plot.xpd=TRUE
- Mari legenda muncul di luar wilayah merencanakan.horiz=TRUE
- menginstruksikan untuk menghasilkan legenda horisontal.bty="n"
- detail gaya untuk menyingkirkan kotak pembatas legenda.Hal yang sama berlaku ketika menambahkan legenda ke samping:
Di sini kita cukup menyesuaikan posisi legenda dan menambahkan ruang margin tambahan ke sisi kanan plot. Hasil:
sumber
Anda bisa melakukan ini dengan Plotly R API , dengan salah satu kode, atau dari GUI dengan menyeret legenda ke tempat yang Anda inginkan.
Berikut ini sebuah contoh. Grafik dan kode juga ada di sini .
Anda dapat memposisikan legenda di luar grafik dengan menetapkan salah satu dari nilai x dan y ke 100 atau -100.
Berikut adalah opsi lainnya:
list("x" = 100, "y" = 0)
untuk Bagian Luar Kanan Bawahlist("x" = 100, "y"= 1)
Luar Kanan Ataslist("x" = 100, "y" = .5)
Luar Kanan Tengahlist("x" = 0, "y" = -100)
Di bawah Kirilist("x" = 0.5, "y" = -100)
Di bawah Centerlist("x" = 1, "y" = -100)
Di bawah KananLalu responnya.
response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));
Plotly mengembalikan URL dengan grafik Anda saat Anda melakukan panggilan. Anda dapat mengaksesnya lebih cepat dengan menelepon
browseURL(response$url)
sehingga grafik Anda akan terbuka di browser untuk Anda.Itu memberi kita grafik ini. Anda juga dapat memindahkan legenda dari dalam GUI dan kemudian grafik akan berskala sesuai. Pengungkapan penuh: Saya di tim Plotly.
sumber
Coba
layout()
yang saya gunakan untuk ini di masa lalu dengan hanya membuat plot kosong di bawah ini, diskalakan dengan benar sekitar 1/4 atau lebih dan menempatkan bagian legenda secara manual di dalamnya.Ada beberapa pertanyaan lama di sini tentang
legend()
yang harus Anda mulai.sumber