在geom_tile中订购轴标签

Slo*_*ner 9 r ggplot2

我有一个数据框,其中包含来自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,carssteel.事实上,x轴已按字母顺序排序,但如果不是这样,我不知道如何实现.

关于不得不提出这个问题,我感到有些尴尬,因为我知道在SO上有许多类似的东西,但R中的排序和排序仍然是我的个人bugbear,我无法让这个工作.虽然我确实尝试过,除了最简单的情况之外,我在一连串的电话中丢失了factor,levels.sort,orderwith.

问:如何安排上面的高亮表,以便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轴未排序.我很困惑.我错过了什么,却看不出它是什么.

带有真实数据的情节截图

smi*_*lig 6

图表上的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 industriessteelcars在两者之间.

在此输入图像描述

  • 谢谢您的回答。如果我使用上面的“ggplot”调用并将其插入到我的代码中,我会收到“UseMethod("limits") 中的错误:没有适用于“限制”的适用方法应用于“NULL”类的对象”错误。除了添加“xlim”和“ylim”语句之外,您还做了其他事情吗? (2认同)