Menghadapi beberapa kumpulan data di ggplot: cara mengatur skala

Saya mencoba melakukan sesuatu yang sepertinya cukup mudah di ggplot. Saya kira saya tidak mencari istilah yang benar dan karenanya tidak ada yang muncul. Pada dasarnya saya memiliki data dari satu bingkai data, dan memetakan data di bingkai lain. Saya ingin fungsi facet_wrap mengabaikan data dalam bingkai data peta saat menentukan skala yang sesuai. Berikut ini beberapa kode yang dapat direproduksi:

mapdata <- map_data("world")
df1 <- data.frame(category="A", lon=rnorm(20, -160, 3), lat=rnorm(20, 55, 3))
df2 <- data.frame(category="B", lon=rnorm(20, -130, 3), lat=rnorm(20, 52, 3))
df <- rbind(df1, df2)
g <- ggplot() + geom_point(data=df, aes(lon, lat)) + facet_wrap("category", scales="free")

Titik tanpa petaTapi sekarang jika saya mencoba menambahkan peta ke setiap faset, ia menggunakan rentang dari kedua data set.

g + geom_polygon(data=mapdata, aes(x=long, y=lat, group=group))

Menunjuk dengan peta

Bagaimana cara memberi tahu ggplot untuk hanya menggunakan bingkai data df saat menghitung batasnya? Pada dasarnya saya ingin memusatkan subplot pada titik-titik, namun memiliki peta yang menunjukkan untuk memberikan perspektif di mana mereka berada. Setiap saran akan sangat dihargai.


person Cole Monnahan    schedule 31.03.2014    source sumber
comment
Saya mencoba memikirkan sesuatu yang lebih baik daripada sekadar mengelompokkan data peta Anda atau menggunakan coord_cartesian, tetapi saya sering menangani peta.   -  person joran    schedule 01.04.2014


Jawaban (1)


Masalah telah dikomentari sebelumnya, sehingga tidak ada cara asli untuk melakukannya. Subsetting mungkin merupakan pilihan terbaik Anda di sini. Tambahkan kategori ke mapdata, dan facet_wrap cukup pintar untuk memisahkan batasan untuk kategori yang berbeda.

mapdata$category <- ifelse(
  findInterval(mapdata$lon, range(df1$lon)) == 1 & 
    findInterval(mapdata$lat, range(df1$lat)) == 1, 
  "A",
  ifelse(
    findInterval(mapdata$lon, range(df2$lon)) == 1 & 
      findInterval(mapdata$lat, range(df2$lat)) == 1,
    "B",
    NA)
)

g + geom_polygon(data=mapdata[!is.na(mapdata$category), ], aes(x=long, y=lat, group=group))

masukkan deskripsi gambar di sini

Beberapa pekerjaan tambahan diperlukan untuk membuat ini terlihat cantik (mungkin area yang lebih besar untuk dijadikan bagian?), tetapi Anda mengerti idenya.

person tonytonov    schedule 02.04.2014
comment
tonytonov -- Terima kasih untuk tautan ini. Saya akan mencoba-coba saran Anda dan berharap mendapatkan solusi asli di masa mendatang. - person Cole Monnahan; 03.04.2014