gpt4 book ai didi

将 ggplot2 map 旋转到任意角度

转载 作者:行者123 更新时间:2023-12-03 20:00:54 25 4
gpt4 key购买 nike

类似于 ggplot2: How to rotate a graph in a specific angle? ,但我不希望图像/正方形旋转,我希望在框架内旋转数据。
例如,如果我从这个开始:

library(ggplot2)
usa <- maps::map('usa', plot=FALSE)

ggplot(as.data.frame(usa[c("x","y")]), aes(x,y)) +
coord_quickmap() +
geom_path()
usa map, north-up
我希望能够生成这个:
usa map, rotated
  • 旋转需要保留空间数据的纵横比
  • 我需要支持任意旋转,不受 90 度跳跃限制
  • 我想是否可以保留实际的网格(以保留 ggplot2 内的默认行为),但如果不能,我可以手动生成它们
  • 我希望通用图的封闭矩形保持不变,包括(此处未显示)标题和副标题
  • 如果坐标系不变,我会喜欢它,这意味着我可以添加其他图层,这些图层随后会自动欣赏旋转。 @qdread 的回答提供了替代方案,其中单个函数可以计算旋转(尽管我不知道如何使用空间数据在数学上做到这一点)
  • 请忽略:
  • 左上角的网格问题,我的photoshopping不完整
  • x 轴标签,数字错误(y 轴很好)(可以删除,不需要)


  • 我想知道这是否可以通过 CRS 完成/projections,但我对它们不够聪明,无法正式/正确地使用它。

    最佳答案

    编辑2:
    使用 oblique mercator projection旋转 map :

    #crs with 45degree shift using +gamma
    # lat_0 and lonc approximate centroid of US
    crs_string = +proj=omerc +lat_0=36.934 +lonc=-90.849 +alpha=0 +k_0=.7 +datum=WGS84 +units=m +no_defs +gamma=45"

    # states data & libraries in code chunk below
    ggplot(states) +
    geom_sf() +
    geom_sf(data = x, color = 'red') +
    coord_sf(crs = crs_string,
    xlim = c(-3172628,2201692), #wide limits chosen for animation
    ylim = c(-1951676,2601638)) + # set as needed
    theme_bw() +
    theme(axis.text = element_blank())

    enter image description here
    Gamma 动画从 0:360 开始,以 10 度为增量,alpha 常数为 0。伪影来自 gif 压缩,实际图看起来像上面标记为 45 的图。
    enter image description here
    之前的回答:
    我认为您可以通过将投影更改为兰伯特方位角等面积并调整 +lon_0=x 从不同的角度“看”地球来“旋转”绘图(包括经纬网)。在投影字符串中。
    这应该可以满足您的大部分目标,但我不知道如何获得精确的度数旋转。
    下面我已经改造了 states_sf sf 对象在绘图前手动。通过对数据使用 crs 4326 并添加 + coord_sf(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-140 +lat_0=40") 来转换绘图(以及所有绘制的 sf 数据)可能会更容易。到最后 ggplot() +称呼。
    library(sf)
    #> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
    library(urbnmapr)
    library(tidyverse)

    # get sf of the us, remove AK & HI,
    # transform to crs 4326 (lat & lon)
    states_sf <- get_urbn_map("states", sf = TRUE) %>%
    filter(!state_abbv %in% c('AK', 'HI')) %>%
    st_transform(4326)

    #centroid of us to 'look' at the US from directly above the center
    us_centroid <- st_union(states_sf) %>% st_centroid() %>% st_transform(4326)

    st_coordinates(us_centroid)
    #> X Y
    #> 1 -99.38208 39.39364

    # Plots, changing the +lon_0=xxx of the projection
    p1 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-99.382 +lat_0=39.394") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from above its centroid 39.3N 99.4W')

    p2 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-70 +lat_0=40") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from 40N 70W')

    p3 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-50 +lat_0=40") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from 40N 50W')

    p4 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-30 +lat_0=40") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from 40N 30W')

    p5 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-10 +lat_0=40") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from 40N 10W')

    p6 <- states_sf %>%
    st_transform("+proj=laea +x_0=0 +y_0=0 +lon_0=-140 +lat_0=40") %>%
    ggplot(aes()) +
    geom_sf(fill = "black", color = "#ffffff") +
    ggtitle('US from 40N 140W')

    p1

     p3

     p5

     p6

    创建于 2021-03-31 由 reprex package (v0.3.0)
    编辑:
    当使用投影 "+proj=omerc +lonc=-90 +lat_0=40 +gamma=0 +alpha=0" 时,看起来您可以通过 alpha 和 gamma 的组合获得任何角度。 .我不知道它们到底是如何关联的(与方位角有关),但这应该有助于将其可视化:
    # Basic template for rotating, keeping US map centered.
    # adjust alpha and gamma by trial & error
    crs <- "+proj=omerc +lonc=90 +lat_0=40 +gamma=90 +alpha=0"

    states_sf %>%
    ggplot() +
    geom_sf(fill = 'green') +
    coord_sf(crs = crs)
    enter image description here
    更广泛的 alpha 和 gamma 动画 can be found here.

    关于将 ggplot2 map 旋转到任意角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66889558/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com