在geom_tile中订购轴标签

时间:2012-07-22 09:14:17

标签: 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))

产生这样的情节:

highlight table

在真实情节中,450细胞表很好地显示了订单集中的“热点”。我想要实现的最后一个改进是按字母顺序在x轴和y轴上排列项目。因此,在上图中,y轴(variable)将按all regionsamericas,然后europe和x轴(industry排序)将被订购all industriescarssteel。事实上,x轴已按字母顺序排序,但如果不是这样的话,我不知道如何实现。

我觉得有点尴尬不得不提出这个问题,因为我知道在SO上有很多类似的东西,但R中的排序和排序仍然是我的个人bugbear,我无法让这个工作。虽然我确实尝试过,除了最简单的情况之外,我在对factorlevelssortorderwith的电话中迷路了。

问。如何排列上面的高亮表,以便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 ...

但是,应用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    

一直到:

 [334] Other areas           Other areas           Other areas          
 [337] Other areas           Other areas           Other areas          
 [340] Other areas

如果你做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"  

即上述的非反转版本。

以下镜头显示了真实数据的图表。如您所见,x轴已排序,而y轴未排序。我很困惑。我错过了什么,却看不出它是什么。

screenshot of plot with real data

5 个答案:

答案 0 :(得分:6)

图表上的y轴也已按字母顺序排序,但是来自原点。我认为您可以使用xlimylim来实现所需轴的顺序。例如:

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))

将从顶部的all regions开始排序y轴,然后是americas,然后是底部的europe(技术上是反向字母顺序)。 x轴按字母顺序排列,从all industriessteel,其间为cars

enter image description here

答案 1 :(得分:4)

正如smillig所说,默认情况下已按字母顺序排列轴,但y轴将从左下角开始排序。

ggplot2 的基本规则几乎适用于您在特定订单中所需的任何内容:

  • 如果您希望按特定顺序显示某些内容,则必须将相应的变量设为一个因子,并按所需顺序排序。

在这种情况下,您只需要这样做:

mymelt$variable <- with(mymelt,factor(variable,levels = rev(sort(unique(variable)))))

无论您是使用stringsAsFactors = TRUE还是FALSE运行R,都应该有效。

此原则适用于订购轴标签,订购条,订购条形图,订购方面等等。

对于连续变量,有一个方便的scale_*_reverse(),但显然不适用于离散变量,我认为这是一个很好的补充。

答案 2 :(得分:0)

也许这个StackOverflow问题可以提供帮助:

Order data inside a geom_tile

特别是Brandon Bertelsen的第一个答案:

  

&#34;请注意,它不是一个有序因素,它是正确顺序中的一个因素&#34;

它帮助我在ggplot2 geom_tile图中获得了正确的y轴顺序。

答案 3 :(得分:0)

也许有点晚了,

with(mymelt,factor(variable,levels = rev(sort(unique(variable)))))

这个功能没有订购,因为您正在订购&#34;变量&#34;没有秩序(它是一个无序的因素)。

你应该首先使用as.character函数将变量转换为字符,如下所示:

with(mymelt,factor(variable,levels = rev(sort(unique(as.character(variable))))))

答案 4 :(得分:0)

另一种可能性是使用预测库中的 fct_reorder

library(forecast)
mydf %>%
pivot_longer(cols=c('all regions', 'americas', 'europe')) %>% 
  mutate(name1=fct_reorder(name, value, .desc=FALSE)) %>% 
  ggplot( aes(x = industry, y = name1, fill = value)) +
  geom_tile() + geom_text(aes( label = value))