Диаграмма с кривой полярных уравнений R Plotly - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь построить график полярных уравнений в R, используя график.Однако, когда я рисую кривую розы, я не получаю нужное количество лепестков на графике.

Мой код ...

library(plotly)

f <- function(){
   output <- matrix(ncol=2, nrow = 361)
   for (i in 0:360){
        output[i,1] <- i
       output[i,2] <- 3 * cos(2 * (i * pi/180))
   }
   return(output)
 }
 mf <- f()
 df <- data.frame("theta" = mf[,1], "r"=mf[,2])

 p <- plot_ly(
     df,
     type = 'scatterpolar',
     mode = 'lines'
   ) %>%
   add_trace(
     r = ~r,
     theta = ~theta,
     name = 'Function',
     line = list(
        color = 'red'
    )
   ) %>%
   layout(
      title = 'Polar Graph',
      font = list(
        family = 'Arial',
        size = 12,
        color = '#000'
      ),
      showlegend = F
 )
 p

Результирующий график ...

Graph

На что должен напоминать график ...

Graph

Может кто угодноскажите, что я делаю не так или есть более простой способ сделать это в R?Благодаря.

1 Ответ

0 голосов
/ 24 октября 2018

Для обычного полярного графика я привык к центру с нулевым радиусом, но в вашем случае центр графика имеет -3 в качестве радиуса.Поэтому вы не получите ожидаемого результата при использовании plot_lt ().Возможно, plot_lt () позволит вам изменить это в конфигурации, но я не смог его найти.

Возможное решение - сместить ангелов и радиус так, чтобы радиус всегда был больше нуля.Это делается в функции «shift_center_zero» ниже.Для каждого отрицательного радиуса умножьте на -1, чтобы получить положительный результат, и для этих строк сделайте сдвиг угла таким образом, чтобы радиус находился на другой стороне от центра.Сдвиг угла выполняется путем добавления половины раунда (180 градусов) и определения модуля полного раунда (360 градусов), чтобы ограничить угол таким образом, чтобы он находился в пределах одного раунда.

shift_center_zero <- function(m){
      m_negative <- m[,2]<0 # get negative rows
      m[m_negative,1] <- (m[m_negative,1]+180)%%360 # angle shift
      m[m_negative,2] <- -1*m[m_negative,2] # radius shift
      return(m)
    }

Остальныеваш код почти такой же, с nrow = 360 вместо 361 для удаления NA и использованием новой функции shift_center_zero.

library(plotly)

f <- function(){
  output <- matrix(ncol=2, nrow = 360)
  for (i in 0:360){
    output[i,1] <- i
    output[i,2] <- 3 * cos(2 * (i * pi/180))
  }
  return(output)
}
mf <- f()

# make the shift
mf<-shift_center_zero(mf)

df <- data.frame("theta" = mf[,1], "r"=mf[,2])


p <- plot_ly(
  df,
  type = 'scatterpolar',
  mode = 'lines'
) %>%
  add_trace(
    r = ~r,
    theta = ~theta,
    name = 'Function',
    line = list(
      color = 'red'
    )
  ) %>%
  layout(
    title = 'Polar Graph',
    font = list(
      family = 'Arial',
      size = 12,
      color = '#000'
    ),
    showlegend = F
  )
p

The resulting plot

...