Буквы, появляющиеся за пределами графиков при использовании многопланового построения с помощью ggplot и ggplotly - PullRequest
0 голосов
/ 27 мая 2020

Я хочу создать фасетный график, используя как ggplot, так и plotly (если быть точным, ggplotly). Почти все работает нормально. Следующий код:

library(dplyr)
library(plotly)
library(ggplot2)

Year <- c(2000:2008)
Name <- c('A', 'B')
Size <- rep(c('Small', 'Medium', 'Large'), each=6)
City <- c('NY', 'PARIS', 'BERLIN')
Frequency <- sample(x = c(100:1000), size = 144)
Rel_Freq <- sample(x = c(1:100), size = 144, replace = TRUE)

StackData <- data.frame(Year, Name, Size, City, Frequency, Rel_Freq)

StackData$Size <- factor(StackData$Size, levels = c("Small", "Medium", "Large"))
ggplotly(ggplot(StackData, aes(x= Year, y= Frequency, shape = Name, col = Name)) +
  geom_point(size = 3)+
  scale_shape_manual(values= c(17, 6))+
  scale_color_manual(values = c("#37D9E1", "#3D3D3F")) +
  facet_grid(City ~ Size, scales="free_y")+
  theme_bw()+
  theme(legend.position = "bottom",
        panel.background = element_rect(fill = "transparent"),
        axis.text.x = element_text(angle = 30, hjust = 1),
        strip.text.x = element_text( size = 12, face = "bold" ), 
        strip.text.y = element_text( size = 12, face = "bold" ))+
  scale_fill_manual(values = c("#D3D3D3", "#A9A9A9", "#696969"), guide=FALSE)+
  scale_y_continuous(trans = "log10",
                     labels = scales::unit_format(
                       unit = "", 
                       scale = 1))+
  labs(y= "",
       x= ""),
  tooltip = c("x","y","colour"),
  autosize = T, width = 680, height = 530) %>%
  layout(showlegend = FALSE,
         margin = list(l = 0, r = 25, t = 50, b = 130),
         annotations = list(x = .5, y = -0.25, #position of text adjust as needed
                            text = "Super cool Plot",
                            showarrow = F, 
                            xref='paper', 
                            yref='paper',
                            xanchor='auto',
                            yanchor='bottom',
                            xshift=0,
                            yshift=0,
                font=list(size=9, color="black")))

Результаты в этом

enter image description here

Как показано на изображении, есть буква отображается в правом верхнем углу. После некоторых изменений я понял, что это первая буква переменной, на которую я перенаправляю цвет и формы в ggplot (в данном случае «name»).

Как я могу получить тот же график без этого письмо появляется там? И, возможно, более интересно, почему это происходит?

Заранее спасибо,

1 Ответ

0 голосов
/ 27 мая 2020

Эта странная буква «N» взята из легендарной части вашей темы в ggplot:

theme(legend.position = "bottom")

На самом деле, это довольно сложная проблема. ggplotly на самом деле не передает все из ggplot правильно. На этом topi c есть проблема с github, но я полагаю, что проблема не устранена. См .: (legend.position всегда 'right' в ggplotly, кроме случая legend.position = 'none') https://github.com/ropensci/plotly/issues/1049

В вашем случае legend.position = "bottom" аргумент игнорируется ggplotly.

Вариант 1 : Похоже, вам может не понадобиться легенда на диаграмме. В этом случае вам может быть лучше синхронизировать вызовы легенды через ggplot и ggplotly:

# ggplot portion
theme(legend.position = "none")
# plotly portion:
layout(showlegend = FALSE)

Вариант 2: Отформатируйте легенду только в графическом режиме. Из приведенной выше ссылки на проблему github это была одна из предложенных идей:

ggplotly(
  ggplot(df, aes(year, freq, color = clas)) +
    geom_line() +
    theme(legend.position = 'top')
) %>%
  layout(legend = list(
      orientation = "h"
    )
  )

Я изменил ваш код, используя вариант 1, и придумал следующее. Странной буквы "N" больше нет!

library(dplyr)
library(plotly)
library(ggplot2)

Year <- c(2000:2008)
Name <- c('A', 'B')
Size <- rep(c('Small', 'Medium', 'Large'), each=6)
City <- c('NY', 'PARIS', 'BERLIN')
Frequency <- sample(x = c(100:1000), size = 144)
Rel_Freq <- sample(x = c(1:100), size = 144, replace = TRUE)

StackData <- data.frame(Year, Name, Size, City, Frequency, Rel_Freq)

StackData$Size <- factor(StackData$Size, levels = c("Small", "Medium", "Large"))
StackData

ggplotly(ggplot(StackData, aes(x= Year, y= Frequency, shape = Name, col = Name)) +
           geom_point(size = 3)+
           scale_shape_manual(values= c(17, 6))+
           scale_color_manual(values = c("#37D9E1", "#3D3D3F")) +
           facet_grid(City ~ Size, scales="free_y")+
           theme_bw()+
           theme(legend.position = "none",        ## this is the only change to your code
                 panel.background = element_rect(fill = "transparent"),
                 axis.text.x = element_text(angle = 30, hjust = 1),
                 strip.text.x = element_text( size = 12, face = "bold" ), 
                 strip.text.y = element_text( size = 12, face = "bold" ))+
           scale_fill_manual(values = c("#D3D3D3", "#A9A9A9", "#696969"), guide=FALSE)+
           scale_y_continuous(trans = "log10",
                              labels = scales::unit_format(
                                unit = "", 
                                scale = 1))+
           labs(y= "",
                x= ""),
         tooltip = c("x","y","colour"),
         autosize = T, width = 680, height = 530) %>%
  layout(showlegend = FALSE,
         margin = list(l = 0, r = 25, t = 50, b = 130),
         annotations = list(x = .5, y = -0.25, #position of text adjust as needed
                            text = "Super cool Plot",
                            showarrow = F, 
                            xref='paper', 
                            yref='paper',
                            xanchor='auto',
                            yanchor='bottom',
                            xshift=0,
                            yshift=0,
                            font=list(size=9, color="black")))

Image of Modified PLot

...