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 regionsamericas、次にeuropex 軸 ( ) は、およびのindustryように順序付けられます。実際、x 軸はすでにアルファベット順に並べられていますが、そうでない場合はどうすればよいかわかりません。all industriescarssteel

SOには似たようなものがたくさんあることを知っているので、この質問をしなければならないことに少し恥ずかしい思いをしますが、Rでの並べ替えと順序付けは私の個人的なバグベアのままであり、これを機能させることができません。factor試してみましたが、最も単純なケースを除いて、levels、 、sortorderおよびの呼び出しのウェルターで迷子になりました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

そして、 a を実行する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 軸は並べ替えられていません。私は困惑しています。何かが欠けていますが、それが何であるかわかりません。

実際のデータを含むプロットのスクリーンショット

4

5 に答える 5

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

は、y 軸を上から順に並べ、all regions次にamericaseurope下の順に並べます (技術的には逆のアルファベット順です)。x 軸はアルファベット順に からall industriesまでsteelcarsその間に配置されます。

ここに画像の説明を入力

于 2012-07-22T11:05:40.160 に答える
4

smillig が言うように、デフォルトではすでに軸がアルファベット順に並べられていますが、y 軸は左下隅から上に並べられます。

特定の順序で必要なほとんどすべてに適用されるggplot2の基本的なルールは次のとおりです。

  • 何かを特定の順序で表示したい場合は、対応する変数を因子にし、レベルを目的の順序でソートする必要があります。

この場合、これを行う必要があるのは次のとおりです。

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

stringsAsFactors = TRUEまたはで R を実行しているかどうかに関係なく動作するはずです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 に答える