проблема с r filter(): plotly против ggplot

#r #ggplot2 #dplyr #r-plotly

#r #ggplot2 #dplyr #r-plotly

Вопрос:

Я начинаю изучать интерактивные данные, а именно и базовый анализ данных с помощью R (в основном plotly). У меня возникла проблема при использовании функции dplyr filter() при построении графика с помощью plotly в R. вот пример использования набора данных gapminder:

 library(gapminder)


# filter by year and continent
gapminder_2002_asia <- gapminder %>%
  filter(year== 2002 amp; continent == "Asia")
# plot gpd/capita bar chart using plotly
gapminder_2002_asia %>%
  plot_ly() %>%
  add_bars(x= ~country, y = ~gdpPercap, color = ~country)
 

вот результаты: все страны мира, представленные в исходном наборе данных, находятся на оси x:
график графика в виде изображения

введите описание изображения здесь

С другой стороны, если просто создать статический график с помощью ggplot, у меня на оси x отображаются только азиатские страны:

 gapminder_2002_asia %>%
  ggplot(aes(country, gdpPercap, fill = country))  
  geom_col()
 

график ggplot

введите описание изображения здесь

Я действительно не понимаю, как это происходит, поскольку они оба происходят из одного и того же df..

Ответ №1:

Очень странно.

В качестве альтернативы, пока вы отлаживаете этот код, почему бы не попробовать использовать ggplotly()?

Например,

 p <- gapminder_2002_asia %>%
ggplot(aes(country, gdpPercap, fill = country))  
geom_col()

plotly::ggplotly(p)
 

Мне было бы любопытно, какая версия сюжета вышла в конце!

Ответ №2:

Причина в том, что plotly принимает все уровни внутри переменной country, в то время ggplot2 как принимает только доступные значения в вашем наборе данных. Итак, чтобы получить те же результаты, вы можете использовать это:

 library(plotly)
library(ggplot2)
#Plotly
gapminder_2002_asia %>%
  plot_ly() %>%
  add_bars(x= ~country, y = ~gdpPercap, color = ~country)
 

Вывод:

введите описание изображения здесь

И с ggplot2 :

 #ggplot2
gapminder_2002_asia %>%
  ggplot(aes(country, gdpPercap, fill = country))  
  geom_col() 
  scale_x_discrete(limits=levels(gapminder_2002_asia$country)) 
  theme(axis.text.x = element_text(angle=90))
 

Вывод:

введите описание изображения здесь

Обновление: чтобы получить тот же результат, plotly вы могли бы использовать что-то вроде этого, что будет похоже на ваш ggplot2 исходный код для построения графика:

 #Plotly 2
gapminder_2002_asia %>%
  mutate(country=as.character(country)) %>%
  plot_ly() %>%
  add_bars(x= ~country, y = ~gdpPercap, color = ~country)
 

Вывод:

введите описание изображения здесь

Ключ к решению — это факторы в вашем наборе данных.

Другой вариант может быть fct_drop() из forcats (большое спасибо и благодарность @user2554330):

 library(forcats)
#Plotly 2
gapminder_2002_asia %>%
  mutate(country=fct_drop(country)) %>%
  plot_ly() %>%
  add_bars(x= ~country, y = ~gdpPercap, color = ~country)
 

Вывод:

введите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ, но на самом деле то, что я хотел получить, было противоположным, то есть только азиатские страны на моем графике Plotly..

2. @Vivvi Привет, пожалуйста, проверьте мое последнее обновление и дайте мне знать, если это сработает для вас!

3. @Vivvi пожалуйста, проверьте обновленную часть решения в конце, где я включил новый код!

4. да, это работает, спасибо! .. хотя я действительно не понимаю, почему, поскольку обычно уровни были отфильтрованы из исходного набора данных?

5. У факторов есть levels атрибут, который может содержать значения, которых нет (поэтому в таблицах может быть 0 значений). filter оставляет уровни в покое. Изменение на символ приводит к его потере. Вы также можете использовать fct_drop(country) , чтобы оставаться в качестве фактора, но без пустых уровней; по умолчанию ggplot2 шкалы делают что-то подобное.