web-dev-qa-db-ja.com

ggplot2での離散軸の複製(および変更)

Ggplot2プロットの左側のY軸を右側に複製し、離散(カテゴリ)軸の目盛りラベルを変更します。

私は この質問 への回答を読みましたが、 パッケージのリポジトリページ からわかるように、switch_axis_position()関数はcowplotから削除されましたパッケージ(ggplot2のネイティブ機能を引用した作者(近いですか?))。

Ggplot2の第2軸の reference ページを見てきましたが、そのドキュメントのすべての例ではscale_y_continuous のではなく scale_y_discrete。実際、離散関数を使用しようとすると、エラーが発生します。

Error in discrete_scale(c("y", "ymin", "ymax", "yend"), "position_d",  : 
unused argument (sec.axis = <environment>)

とにかくこれをggplot2で行うことはありますか?完全にハッキングされたソリューションでも十分です。前もって感謝します。 (以下のMRE)

library(ggplot2)

# Working continuous plot with 2 axes
ggplot(mtcars, aes(cyl, mpg))  + 
    geom_point() + 
    scale_y_continuous(sec.axis = sec_axis(~.+10))


# Working discrete plot with 1 axis
ggplot(mtcars, aes(cyl, as.factor(mpg)))  + 
    geom_point() 


# Broken discrete plot with 2 axes
ggplot(mtcars, aes(cyl, as.factor(mpg)))  + 
    geom_point() +
    scale_y_discrete(sec.axis = sec_axis(~.+10))
18
Alex P. Miller

離散係数を取り、それを数値で表現します。次に、それをミラーリングして、目盛りを数値ではなく因子レベルに再ラベル付けできます。

library(ggplot2)

irislabs1 <- levels(iris$Species)
irislabs2 <- c("foo", "bar", "buzz")

ggplot(iris, aes(Sepal.Length, as.numeric(Species))) +
  geom_point() +
  scale_y_continuous(breaks = 1:length(irislabs1),
                     labels = irislabs1,
                     sec.axis = sec_axis(~.,
                                         breaks = 1:length(irislabs2),
                                         labels = irislabs2))

次に、expand =引数を必要に応じてスケールで使用し、デフォルトの離散スケールをより厳密に模倣します。

enter image description here

15
Brian