使用如下所示的数据框df1
- 我需要按make
+-----------------------------------------+
|reg |make |model |year|abs |gears|fm|
+-----------------------------------------+
|ax1234|Toyota|Corolla|1999|true |6 |0 |
|ax1235|Toyota|Corolla|1999|false|5 |0 |
|ax1236|Toyota|Corolla|1992|false|4 |NA|
|ax1237|Toyota|Camry |2001|true |7 |1 |
|ax1238|Honda |Civic |1994|true |5 |NA|
|ax1239|Honda |Civic |2000|false|6 |0 |
|ax1240|Honda |Accord |1992|false|4 |NA|
|ax1241|Nissan|Sunny |2001|true |6 |0 |
|ax1242| | |1998|false|6 |0 |
|ax1243|NA |NA |1992|false|4 |NA|
+-----------------------------------------+
我需要按make
找到汽车的百分比 - 我这样做。
df2 <- aggregate(reg ~ addNA(make), df1, function(x){ return (length(x)/nrow(df1))})
> df2
addNA(make) reg
1 0.1
2 Honda 0.3
3 Nissan 0.1
4 Toyota 0.4
5 <NA> 0.1
>
最后,我按如下方式绘制条形图。
df3 <- df2[order(-df2[,2]),]
ggplot(df3, aes(x=df3[,1], y=df3[,2])) + geom_bar(stat = "identity") +
xlab("make") + scale_y_continuous(labels = percent, name="perc")
给出了下面的情节。
问题 -
答案 0 :(得分:1)
我建议在线浏览许多ggplot2
教程。您可以通过多种方式简化代码,或者使用不同的工具,但这些方法会随着时间的推移而持续使用。
我相信您可以做的最大改进是使用您在通话中传递的数据中的裸变量名称。您还可以通过对不同geoms
您面临的第二个问题是ggplot
在大多数情况下确定数据中变量的顺序。使用您传递的离散数据,您需要按正确的顺序创建factor
。您几乎就在那里,正确地对数据进行了排序。你只需要从中获得创造一个因素。
您的电话:
df2 <- aggregate(reg ~ addNA(make), df, function(x){ return (length(x)/nrow(df))})
df3 <- df2[order(-df2[,2]),]
ggplot(df3, aes(x=df3[,1], y=df3[,2])) + geom_bar(stat = "identity") +
xlab("make") + scale_y_continuous(labels = percent, name="perc")
我的电话:
df2 <- aggregate(reg ~ make, df, function(x){ return (length(x)/nrow(df))})
order <- df2$make[order(-df2$reg)]
df2$make <- factor(df2$make, order)
ggplot(df2, aes(x = make, y = reg)) +
geom_col() +
scale_y_continuous(labels = percent) +
labs(x = "Make", y = "Percent")
我使用geom_col
这是geom_bar(stat = "identity")
和labs()
的快捷方式,可以在一次通话中设置多个标签。
答案 1 :(得分:0)
对于条形的顺序,如上所述,诀窍是使用因子,因为ggplot2将按字母顺序对字符进行排序。
您可以利用dplyr
包来操作数据,而不必使用管道%>%
运算符在每个步骤存储数据,该运算符将数据作为下一个函数的第一个参数传递。登记/>
这是我的版本:
library(dplyr) # For data manipulation and the pipe (%>%) operator
library(forcats) # For factor handling (here fct_reorder())
library(ggplot2) # For plots
library(scales) # For percent scale
# Start with the data frame and pass it with the pipe to the next function
df1 %>%
# Then we group it by make
group_by(make) %>%
# We summarise by vreating a prop variable, n() returns the number of row by group
summarise(prop = n()/nrow(df1)) %>%
# We then transform the make variable into a factor, the order of the level
# given by -prop (to have it in decreasing order)
mutate(make = fct_reorder(make, -prop)) %>%
# And we pass it to the plot
# Notice the transition to + instead of %>%
ggplot(aes(x = make, y = prop)) +
geom_col() +
scale_y_continuous(label = percent) +
labs(x = "Make", y = "Percent")
另请注意,对我来说,NAs存储为NA
而不是字符串"NA"
,因此无论值如何,都将绘制为最后一个条形图。