12

我有一个数据框,其中包含来自 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))

这会产生这样的情节:

高亮表

在实际图中,450 个单元格表很好地显示了订单集中的“热点”。我要实现的最后一个改进是按字母顺序排列 x 轴和 y 轴上的项目。所以在上图中,y 轴 ( variable) 的顺序为all regions, americas, 然后europex 轴 ( industry) 的顺序为all industries,carssteel。事实上,x 轴已经按字母顺序排列,但如果不是这样,我不知道如何实现这一点。

我对不得不问这个问题感到有些尴尬,因为我知道在 SO 上有很多类似的问题,但是 R 中的排序和排序仍然是我个人的问题,我无法让它工作。尽管我确实尝试过,但除了最简单的情况外,我在对factorlevelssort和的大量调用中迷失了order方向with

Q. 如何排列上面的高亮表,使 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

如果你做 alevels()它似乎显示同样的事情:

 [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 轴未排序。我很困惑。我错过了一些东西,但看不到它是什么。

带有真实数据的绘图截图

4

5 回答 5

6

图表上的 y 轴也已经按字母顺序排列,但从原点开始。我认为您可以使用xlimand来实现您想要的轴的顺序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))

将从all regions顶部开始对 y 轴进行排序,然后是americas,然后europe是底部(从技术上讲,这是逆字母顺序)。x 轴按字母顺序排列all industries,介于steel两者cars之间。

在此处输入图像描述

于 2012-07-22T11:05:40.160 回答
4

正如 smillig 所说,默认值已经按字母顺序排列轴,但 y 轴将从左下角向上排列。

ggplot2的基本规则适用于几乎任何你想要的特定顺序的东西:

  • 如果您希望某物以特定顺序出现,您必须将相应的变量设为一个因子,并按照您想要的顺序对级别进行排序。

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

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

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

此原则适用于排序轴标签、排序条、条内排序段、排序方面等。

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

于 2012-07-22T15:04:07.570 回答
1

另一种可能性是使用预测中的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))
于 2020-07-29T17:55:26.250 回答
0

可能有点晚了,

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

此函数不排序,因为您正在订购没有顺序的“变量”(这是一个无序因素)。

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

with(mymelt,factor(variable,levels = rev(sort(unique(as.character(variable))))))
于 2015-02-26T06:44:58.200 回答
0

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

geom_tile 中的订单数据

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

“注意这不是一个有序的因素,它是一个正确顺序的因素”

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

于 2014-07-11T12:51:49.580 回答