我有一个数据框,其中包含来自20多个国家/地区的20多种产品的订单数据.我把它放在一个高亮表中使用ggplot2
代码类似于:
require(ggplot2)
require(reshape)
require(scales)
mydf <- data.frame(industry = c('all industries','steel','cars'),
'all regions' = c(250,150,100), americas = c(150,90,60),
europe = c(150,60,40), check.names = FALSE)
mydf
mymelt <- melt(mydf, id.var = c('industry'))
mymelt
ggplot(mymelt, aes(x = industry, y = variable, fill = value)) +
geom_tile() + geom_text(aes(fill = mymelt$value, label = mymelt$value))
Run Code Online (Sandbox Code Playgroud)
这产生了这样的情节:
在真实的情节中,450细胞表非常好地显示了订单集中的"热点".我想要实现的最后一个改进是按字母顺序在x轴和y轴上排列项目.因此,在上面的曲线图中,y轴(variable
)将被排序为all regions
,americas
,然后europe
与x轴(industry
)将被排序all industries
,cars
和steel
.事实上,x轴已按字母顺序排序,但如果不是这样,我不知道如何实现.
关于不得不提出这个问题,我感到有些尴尬,因为我知道在SO上有许多类似的东西,但R中的排序和排序仍然是我的个人bugbear,我无法让这个工作.虽然我确实尝试过,除了最简单的情况之外,我在一连串的电话中丢失了factor
,levels
.sort
,order
和with
.
问:如何安排上面的高亮表,以便y轴和x轴按字母顺序排列?
编辑:下面的smillig和joran的答案确实解决了测试数据的问题,但真实的数据仍然存在问题:我无法按字母顺序排序.这让我感到头疼,因为数据框的基本结构看起来是一样的.显然我省略了什么,但是什么?
> str(mymelt)
'data.frame': 340 obs. of 3 variables:
$ Industry: chr "Animal and vegetable products" "Food and beverages" "Chemicals" "Plastic and rubber goods" ...
$ variable: Factor w/ 17 levels "Other areas",..: 17 17 17 17 17 17 17 17 17 17 ...
$ value : num 0.000904 0.000515 0.007189 0.007721 0.000274 ...
Run Code Online (Sandbox Code Playgroud)
但是,应用该with
语句不会产生按字母顺序排序的级别.
> with(mymelt,factor(variable,levels = rev(sort(unique(variable)))))
[1] USA USA USA
[4] USA USA USA
[7] USA USA USA
[10] USA USA USA
[13] USA USA USA
[16] USA USA USA
[19] USA USA Canada
[22] Canada Canada Canada
[25] Canada Canada Canada
[28] Canada Canada Canada
Run Code Online (Sandbox Code Playgroud)
一直到:
[334] Other areas Other areas Other areas
[337] Other areas Other areas Other areas
[340] Other areas
Run Code Online (Sandbox Code Playgroud)
如果你做了levels()
它似乎表明同样的事情:
[1] "Other areas" "Oceania" "Africa"
[4] "Other Non-Eurozone" "UK" "Other Eurozone"
[7] "Holland" "Germany" "Other Asia"
[10] "Middle East" "ASEAN-5" "Singapore"
[13] "HK/China" "Japan" "South Central America"
[16] "Canada" "USA"
Run Code Online (Sandbox Code Playgroud)
也就是说,上面的非反转版本.
以下镜头显示了真实数据的图形.如您所见,x轴已排序,而y轴未排序.我很困惑.我错过了什么,却看不出它是什么.
图表上的y轴也已按字母顺序排序,但是来自原点.我认为你可以通过使用xlim
和实现你想要的轴的顺序ylim
.例如:
ggplot(mymelt, aes(x = industry, y = variable, fill = value)) +
geom_tile() + geom_text(aes(fill = mymelt$value, label = mymelt$value)) +
ylim(rev(levels(mymelt$variable))) + xlim(levels(mymelt$industry))
Run Code Online (Sandbox Code Playgroud)
将从all regions
顶部开始,americas
然后europe
在底部(从技术上反向字母顺序)排序y轴.x轴是按字母顺序从排序all industries
到steel
与cars
在两者之间.