8

ggplot2のファセットドットプロットのファセット内でプロット順序を変更しようとしていますが、機能させることができません。これが私の溶けたデータセットです:

> London.melt
                      country medal.type count
1                 South Korea       gold    13
2                       Italy       gold     8 
3                      France       gold    11
4                   Australia       gold     7
5                       Japan       gold     7
6                     Germany       gold    11
7  Great Britain & N. Ireland       gold    29
8          Russian Federation       gold    24
9                       China       gold    38
10              United States       gold    46
11                South Korea     silver     8
12                      Italy     silver     9
13                     France     silver    11
14                  Australia     silver    16
15                      Japan     silver    14
16                    Germany     silver    19
17 Great Britain & N. Ireland     silver    17
18         Russian Federation     silver    26
19                      China     silver    27
20              United States     silver    29
21                South Korea     bronze     7
22                      Italy     bronze    11
23                     France     bronze    12
24                  Australia     bronze    12
25                      Japan     bronze    17
26                    Germany     bronze    14
27 Great Britain & N. Ireland     bronze    19
28         Russian Federation     bronze    32
29                      China     bronze    23
30              United States     bronze    29

これが私のプロットコマンドです:

qplot(x = count, y = country, data = London.melt, geom = "point", facets = medal.type ~.)

私が得る結果は次のとおりです。

Rプロット

ファセット自体は、このプロットで必要な順序で表示されます。ただし、各ファセット内で、カウントで並べ替えたいと思います。つまり、メダルの種類ごとに、それらのメダルの数が最も多い国などが必要です。ファセットがない場合(たとえば、金メダルのみを表示している場合)に使用した手順は reorder、因子の関数を使用してcountry並べ替えることcountですが、この例では機能しません。

私はあなたが持っているかもしれないどんな提案にも大いに感謝します。

4

3 に答える 3

11

ここでは、ペースト、フリースケール、およびいくつかの再ラベル付けを使用したソリューション

library(ggplot2)
London.melt$medal.type<-factor(London.melt$medal.type, levels = c("gold","silver","bronze"))
# Make every country unique
London.melt$country_l <- with(London.melt, paste(country, medal.type, sep = "_"))
#Reorder the unique countrys
q <- qplot(x = count, y = reorder(country_l, count), data = London.melt, geom = "point") +   facet_grid(medal.type ~., scales = "free_y")
# Rename the countries using the original names
q + scale_y_discrete("Country", breaks = London.melt$country_l, label = London.melt$country)

ここに画像の説明を入力してください

于 2012-08-22T00:54:47.087 に答える
1

これは明らかにかなり遅いです、そして私がしていることのいくつかはおよそ6年前ではなかったかもしれません、しかし私は同様の仕事をしている間にこの質問に出くわしました。目盛りラベルをベクトルで設定するのはいつも気が進まないので、元のラベルを操作できる関数を使用する方が安全だと感じています。

そのために、国とメダルに基づいてファクターID列を作成しています。この場合、これらの列のいずれにもまだ表示されていない区切り文字が機能します_。次にforcats::fct_reorder、を使用して、その列を。で並べ替えることができますcount。この列の最後のいくつかのレベルは以下のとおりであり、カウントが最も高い国とメダルの組み合わせに対応している必要があります。

library(tidyverse)

London_ordered <- London.melt %>%
  mutate(id = paste(country, medal.type, sep = "_") %>%
           as_factor() %>%
           fct_reorder(count, .fun = min))

levels(London_ordered$id) %>% tail()
#> [1] "Great Britain & N. Ireland_gold" "United States_silver"           
#> [3] "United States_bronze"            "Russian Federation_bronze"      
#> [5] "China_gold"                      "United States_gold"

次に、このIDをy軸として使用します。それ自体で、メダルの種類を含む非常に長いラベルが作成されます。一意の区切り文字があるため、y軸ラベルのインライン関数を記述して、区切り文字とそれに続く単語文字を削除し、国だけを残すことができます。ファセット仕様をfacet_wrap関数に移動すると、自由なyスケールを設定できます。

qplot(x = count, y = id, data = London_ordered, geom = "point") +
  scale_y_discrete(labels = function(x) str_remove(x, "_\\w+$")) +
  facet_wrap(~ medal.type, scales = "free_y", ncol = 1)

于 2019-02-26T15:26:34.010 に答える
0

これは私がqplotでできる最善のことです。正確にはあなたが求めていたものではありませんが、より近いものです。OOOPsあなたはすでにそれを理解しているのを見ます。

q <- qplot(x = count, y = reorder(country, count), data = London.melt, geom = "point", facets = medal.type ~.)

dput他の人が改善できるバージョンは次のとおりです。

dput(London.melt)
structure(list(country = structure(c(9L, 6L, 3L, 1L, 7L, 4L, 
5L, 8L, 2L, 10L, 9L, 6L, 3L, 1L, 7L, 4L, 5L, 8L, 2L, 10L, 9L, 
6L, 3L, 1L, 7L, 4L, 5L, 8L, 2L, 10L), .Label = c("Australia", 
"China", "France", "Germany", "Great Britain & N. Ireland", "Italy", 
"Japan", "Russian Federation", "South Korea", "United States"
), class = "factor"), medal.type = structure(c(2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("bronze", 
"gold", "silver"), class = "factor"), count = c(13L, 8L, 11L, 
7L, 7L, 11L, 29L, 24L, 38L, 46L, 8L, 9L, 11L, 16L, 14L, 19L, 
17L, 26L, 27L, 29L, 7L, 11L, 12L, 12L, 17L, 14L, 19L, 32L, 23L, 
29L)), .Names = c("country", "medal.type", "count"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30"))
于 2012-08-21T23:51:44.270 に答える