एक ggplot मानचित्र के लिए एक स्केल बार जोड़ें जिसे ord_sf का उपयोग करके स्केल किया गया है?

Aug 18 2020

मैंने sf पैकेज और ggplot2 का उपयोग करके एक मानचित्र तैयार किया है:

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) 
print(x)

जो Rstudio में निम्नलिखित मानचित्र तैयार करता है:

यह बहुत अच्छा है, लेकिन मुझे इसमें एक स्केल बार जोड़ने की जरूरत है। जब मैं ggsn का उपयोग करके कोड को संशोधित करने का प्रयास करता हूं, तो मुझे स्केल बार बिल्कुल दिखाई नहीं देता है।

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
ggsn::scalebar(state_prov, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)
print(x) 

मैंने कोई सफलता नहीं के साथ ऊंचाई, st.dist और स्थान बदलने की कोशिश की है। जब मैं कॉर्ड_sf () को कॉल हटाता हूं, तो मैं एक खराब स्केल स्केलबार देख सकता हूं, जिससे मुझे विश्वास हो जाता है कि ggsn यह नहीं पहचानता है कि मैप को ord_sf () द्वारा ज़ूम किया जा रहा है।

मैं यह कैसे तय करुं? ggsn आसानी से परिवर्तनीय नहीं लगता है। मैं एक और पैकेज या विधि का उपयोग करने के लिए खुला हूं, लेकिन मुझे समान तरीके से ggplot को कॉल करना जारी रखने की आवश्यकता है क्योंकि मेरे पास एक ही संरचना के आधार पर बहुत अधिक जटिल नक्शा है।

धन्यवाद!

जवाब

2 nniloc Aug 18 2020 at 07:33

जैसा कि आप उल्लेख करते हैं, यदि आप coord_sfअपने कोड के हिस्से को कमेंट करते हैं तो स्केल बार दिखाता है। मेरा अनुमान पूरे डेटासेट से ggsn::scalebarअपना topleftस्थान प्राप्त कर रहा होगा state_prov, और जब आप coord_sfस्केलबार का उपयोग करके ज़ूम आउट करते हैं तो क्रॉप किया जाता है।

संपादित करें: इस पैमाने पर लेट / लॉन्ग प्रोजेक्शन वाले मानचित्र पर स्केल बार लगाते समय अत्यधिक विकृति से सावधान रहें:https://stackoverflow.com/a/41373569/12400385

यहां दिखाने के लिए स्केल बार पाने के लिए कुछ विकल्प दिए गए हैं।

विकल्प 1

ggspatial::annotation_scaleइसके बजाय का उपयोग करें के ggsnरूप में परिभाषित में ज़ूम को पहचानने लगता है coord_sf

ggplot(data=state_prov) + 
  geom_sf()+
  coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggspatial::annotation_scale(location = 'tl')

विकल्प 2

अपने मूल कोड का उपयोग करें लेकिन state_provसाजिश रचने से पहले फसल करें ताकि scalebarसही मिल सके topleft

state_prov_crop <- st_crop(state_prov, xmin=-170, xmax = -95, ymin = 40, ymax = 75)

ggplot(data=state_prov_crop) + 
  geom_sf()+
  #coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggsn::scalebar(state_prov_crop, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)