#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
шкалы делают что-то подобное.