ggplot corre_polar: у полного круга только 330 ° вместо 360 °. Как исправить? - PullRequest
1 голос
/ 17 июня 2020

В магистерской работе я работаю с деревьями. У меня 36 деревьев, одно дерево - мое главное дерево, все большее дерево я получил расстояние и азимут ° по отношению к главному дереву.

Теперь нарисуйте все деревья, чтобы показать, где они растут. По отношению к основному дереву полный круг графика, кажется, имеет только ~ 330 °.

Вы можете легко увидеть это, посмотрев на метки (которые, как предполагается, являются направлениями неба).

Мне кажется, что это из-за дерева № 24, потому что оно имеет самый высокий азимут ° с 329,4 °.

нет ошибок или других проблем.

Как сделать так, чтобы график представлял собой полный круг с 360 °?

Код

library(ggplot2)

pie <- ggplot(Baumdaten, aes(x = distanz, label = Nr)) 

pie + coord_polar(theta = "y", start = 0) + 
  geom_point(mapping = aes(distanz,azimut), 
             size = 15*Baumdaten$baumumfang/max(Baumdaten$baumumfang), 
             col = "deepskyblue") +
  geom_text(y = Baumdaten$azimut, size = 5) +
  theme_bw(base_size = 15) +
  theme(axis.text.x = element_text(angle=0, vjust = 1, hjust=1, size = 15) )+
  # axis.line.y.left = element_line(),
  # axis.ticks.y.left = element_line()
  # ) +
  labs(x = "Distanz zum Zentralbaum [m]", y = NULL) +
  scale_y_continuous(breaks=c(0,45,90,135,180,225,270,315),
                     labels=c("N","NO","O","SO","S","SW","W","NW") ) + 
  ggtitle("") + 
  theme(plot.title = element_text(hjust = 0.5))

Данные

Baumdaten <- structure(list(Nr = 1:36, baumumfang = c(166.42, 124.03, 117.75, 
130.31, 125.6, 153.86, 164.85, 147.58, 122.46, 109.9, 141.3, 
130.31, 125.6, 122.46, 114.61, 122.46, 139.73, 152.29, 103.62, 
119.32, 117.75, 133.45, 111.47, 117.75, 131.88, 166.42, 141.3, 
106.76, 103.62, 113.04, 150.72, 166.42, 153.86, 139.73, 125.6, 
122.46), baumhoehe = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), distanz = c(0, 3, 5.2, 
5, 10, 12.2, 13, 10.8, 13.8, 14.8, 17.7, 27.1, 27, 35, 14.6, 
24, 12.1, 18.4, 17.3, 26, 25, 29.5, 31.4, 34.1, 37, 46, 46, 43, 
48, 42, 41, 34.4, 25, 24, 20.5, 14.1), azimut = c(0, 113, 261.3, 
30.1, 255.3, 222.6, 180.9, 148, 133.2, 112.6, 117.1, 112, 103.3, 
101.4, 144.7, 119.4, 288.3, 286.5, 317.2, 303.3, 327.1, 314.7, 
325.3, 329.4, 323.5, 325.8, 318.4, 307.6, 301.7, 292, 288.5, 
286.5, 284.4, 277.3, 262.9, 242.8), Kronenverlichtung = c(40L, 
30L, 40L, 98L, 30L, 50L, 95L, 40L, 30L, 40L, 70L, 40L, 40L, 100L, 
40L, 60L, 40L, 95L, 100L, 20L, 20L, 5L, 40L, 100L, 15L, 100L, 
90L, 40L, 60L, 100L, 40L, 70L, 50L, 50L, 30L, 80L), Vergilbung = c(0L, 
0L, 0L, 0L, 0L, 0L, 3L, 1L, 0L, 0L, 1L, 2L, 0L, 0L, 1L, 0L, 1L, 
4L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 1L, 0L, 
0L, 0L, 3L), durchmesser = c(53, 39.5, 37.5, 41.5, 40, 49, 52.5, 
47, 39, 35, 45, 41.5, 40, 39, 36.5, 39, 44.5, 48.5, 33, 38, 37.5, 
42.5, 35.5, 37.5, 42, 53, 45, 34, 33, 36, 48, 53, 49, 44.5, 40, 
39)), row.names = c(NA, -36L), class = "data.frame")

Окружность 330 °:

the 330° circle

1 Ответ

1 голос
/ 17 июня 2020

Короткий ответ : добавьте limits = c(0, 360) к scale_y_continuous(). Ваш сюжет будет выглядеть так, как вы, кажется, имеете в виду.

enter image description here

Более длинный ответ : Я переформатировал и оптимизировал ваш код на следующий:

ggplot(Baumdaten, 
       aes(x = distanz, y = azimut, label = Nr)) +

  geom_point(aes(size = 15 * baumumfang/max(baumumfang)),
             col = "deepskyblue") +
  geom_text(size = 5) +

  coord_polar(theta = "y", start = 0) + 

  labs(title = "",
       x = "Distanz zum Zentralbaum [m]", 
       y = NULL) +
  scale_y_continuous(breaks = seq(0, 359, by = 45), # less typing for same result
                     labels = c("N", "NO", "O", "SO", "S", "SW", "W", "NW"),
                     limits = c(0, 360)) +

  theme_bw(base_size = 15) +
  theme(axis.text.x = element_text(hjust = 1, size = 15),
        plot.title = element_text(hjust = 0.5),
        legend.position = "none")  # hides all legends (necessary since size is
                                   # a mapped aesthetic now)

Некоторые советы по практике кодирования, когда дело доходит до ggplot:

  1. Укажите свои сопоставления aestheti c для ясности. т.е. aes(x = distanz, y = azimut) вместо aes(distanz, azimut).

  2. Поместите общие сопоставления aestheti c на верхний уровень ggplot(), чтобы все слои geom наследовали их по умолчанию, чтобы минимизировать повторение. т.е. aes(x = distanz, y = azimut) должен быть на верхнем уровне, потому что оба слоя geom_point и geom_text используют их.

  3. Вы также можете поместить необычные сопоставления aestheti c на верхний уровень ggplot() если нет путаницы. т.е. aes(label = Nr) может быть здесь на верхнем уровне, поскольку у вас есть только один текстовый слой, но если у вас есть несколько слоев geom_text / geom_label, которые используют разные столбцы из вашего набора данных, было бы проще указать эти сопоставления в соответствующие слои геометрии.

  4. Все сопоставления должны go внутри aes() и без использования символа $. т.е. aes(size = 15 * baumumfang/max(baumumfang)) вместо size = 15 * Baumdaten$baumumfang / max(Baumdaten$baumumfang).

  5. Следуйте последовательному порядку в ваших слоях ggplot, чтобы их было легче отслеживать с течением времени. Это становится особенно полезным, если вы копируете существующий фрагмент кода и изменяете различные детали повсюду. Например, в шпаргалке ggplot2 на веб-сайте RStudio используется следующее:

template

Не указывать детали по умолчанию в элементах темы. Вы можете проверить настройки по умолчанию с помощью calc_element. например, запуск calc_element("axis.text.x", theme_bw(base_size = 15)) в консоли показывает, что его angle / vjust уже равны 0 и 1 соответственно, поэтому вам нужно только указать theme(axis.text.x = element_text(hjust = 1, size = 15)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...