2

Rで2次元テーブルをプロットするときに、軸ラベルのサイズと配置をより細かく制御したいのですが、プロットルールはテーブルオブジェクトとデータフレームで機能が異なるようです。質問を具体的にするために、このメッセージの最後に。を使用して偽のデータを貼り付けましたdput()dept.tableそのコードを実行すると、以下のプロットコードで使用されるオブジェクトが作成されます。

plotRで2Dテーブルを実行すると、次のようにモザイクプロットが作成されます。

plot(dept.table, 
     col=c("yellow","blue","red"), 
     las=1, 
     cex=.7, 
     dir=c("h","v"), 
     off=c(8,4))

この呼び出しによって作成されたプロットの軸ラベルに加えたい変更が3つあります。

まず、上部の「フレッシュマン」、「2年生」などのラベルの高さを交互に変えて、重ならないようにします(短くすることもできますが、今後の参考のためにこれも把握したいと思います。ラベルを短くすると必ずしも便利ではないため)。軸ラベルをオフにして、text()関数を使用して手動で追加することを考えました。ただし、テーブルオブジェクトをプロットする場合、呼び出しxaxt = 'n'への追加plotは明らかに機能しません(Rは「余分な引数'xaxt'は無視されます」というメッセージを表示します)。

もう1つのオプションは、を設定してx軸ラベルを回転させることですlas=2。ただし、読みやすくするために、ラベルを水平にすることをお勧めします。las=2ただし、設定すると、「GraduateStudent」というラベルがプロット領域に重なることに注意してください。

したがって、ここにはいくつかの問題があります。

  1. 手動でラベルを追加できるように、x軸ラベルのプロットをオフにするにはどうすればよいですか?
  2. さらに良いことに、各ラベルの位置を手動で設定しなくても、ラベルが重ならないようにラベルを上下に交互に配置するためのよりエレガントな方法はありますか?
  3. ラベルがプロット領域と重なっている場合、重なっている部分を削除する方法はありますか(ラベルを短くする以外に)?
  4. x軸とy軸のラベルに異なるテキストサイズを設定する方法はありますか?私が作成したい実際のプロットには、より多くの部門(縦軸)があるので、x軸よりもy軸に小さいテキストサイズを使用したいと思います。軸のテキストサイズの唯一のオプションはcex、両方の軸を調整するのようです。各軸を個別に調整する方法はありますか?

  5. y軸のラベルは左揃えです。それらを正しく正当化して、プロット領域に近づける方法はありますか?

ちなみに、私はこのプロットをベースグラフィックで作成しましたが、lattice、ggplot2、またはおそらく別のパッケージでそれを行うためのより良い方法があるかどうかに興味があります。

dept.table = structure(c(10, 15, 20, 200, 5, 15, 35, 200, 49, 15, 25, 20, 
250, 5, 12, 34, 150, 30, 50, 108, 75, 800, 32, 39, 135, 400, 
195, 80, 99, 64, 700, 47, 41, 134, 350, 160, 5, 10, 5, 110, 5, 
4, 10, 30, 13), .Dim = c(9L, 5L), .Dimnames = structure(list(
    c("Anthropology", "Economics", "Mathematics", "Business Administration", 
    "Geography", "Special Education, & Deaf Studies", "History", 
    "Kinesiology & Health Science", "Family & Consumer Sciences"
    ), c("Freshman", "Sophomore", "Junior", "Senior", "Graduate Student"
    )), .Names = c("", "")), class = "table")
4

1 に答える 1

3

ggplotを使用したアプローチ

# convert to a data frame
dept_data <- as.data.frame(dept.table)

(生の数値ではなく)比率をプロットしようとしている場合

# add proportions
library(plyr)
dept_data_prop <- ddply(dept_data, .(Var1), mutate, prop = Freq /sum(Freq))


library(ggplot2)
ggplot(dept_data_prop, aes(x= Var1, y = prop, colour = Var2, fill = Var2)) + 
  geom_bar() + 
  coord_flip() + 
  facet_wrap(~Var1, scales = 'free', ncol = 1) + 
  opts(strip.background =theme_blank(), strip.text.x = theme_blank(), 
       strip.text.y = theme_text(), axis.ticks = theme_blank(), 
       axis.title.x = theme_blank(), axis.text.x = theme_blank()) + xlab('') + 
  scale_fill_brewer('Student',  type = 'div', palette = 5) + 
  scale_colour_brewer('Student', type = 'div', palette = 5) + 
  scale_x_discrete(expand = c(0,0)) + 
  scale_y_continuous(expand=c(0,0))

利用可能なオプションの詳細については、以下をご覧ください。?opts

以下は、 rの学習から適応されます

合計カウントに比例するバー幅を取得するには

dept_data <- as.data.frame(dept.table)
names(dept_data) <- c('department', 'student', 'count')



dept_prop <- ddply(dept_data, .(department), mutate, 
               prop_department = count / sum(count),
               max_department = cumsum(prop_department),
               min_department = max_department - prop_department,
               total_department = sum(count))


dept_prop <- mutate(dept_prop, prop_total = total_department / sum(count))

dept_prop <- ddply(dept_prop, .(student), mutate, 
   max_total = cumsum(prop_total), 
   min_total = max_total - prop_total)



ggplot(dept_prop, aes(xmin = min_department, xmax = max_department, 
                      ymin = min_total, ymax = max_total)) +
 geom_rect(aes(colour = student, fill =student)) + 
 facet_grid(department~., scales = 'free', space = 'free') +
 opts(strip.background =theme_blank(), 
   strip.text.y = theme_text(hjust = 0.05), axis.ticks = theme_blank(), 
   axis.title.x = theme_blank(), axis.text.x = theme_blank(), 
   axis.title.y = theme_blank(), axis.text.y = theme_blank(), 
   legend.position = 'bottom', legend.justification = 'left',
   panel.border = theme_blank(), panel.background = theme_blank(), 
   panel.grid.major = theme_blank(), panel.grid.minor = theme_blank()) +
   xlab('') + 
 scale_fill_brewer('Student',  palette = 'Set1') + 
 scale_colour_brewer('Student', palette = 'Set1') + 
 scale_x_continuous(expand = c(0, 0)) + 
 scale_y_continuous(expand = c(0, 0))
于 2012-05-23T23:27:31.827 に答える