ggplot2を使用して軸に整数値のみを表示する方法


88

私は次のプロットを持っています:

library(reshape)
library(ggplot2)
library(gridExtra)
require(ggplot2)



data2<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(15L, 11L, 29L, 42L, 0L, 5L, 21L, 
22L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
p <- ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15))


data3<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L, 
4L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
q<- ggplot(data3, aes(x =factor(IR), y = value, fill = Legend, width=.15))


##the plot##
q + geom_bar(position='dodge', colour='black') + ylab('Frequency') + xlab('IR')+scale_fill_grey() +theme(axis.text.x=element_text(colour="black"), axis.text.y=element_text(colour="Black"))+ opts(title='', panel.grid.major = theme_blank(),panel.grid.minor = theme_blank(),panel.border = theme_blank(),panel.background = theme_blank(), axis.ticks.x = theme_blank())

y軸に整数のみを表示したい。これが丸めによって達成されるのか、よりエレガントな方法によって達成されるのかは、私にとってそれほど重要ではありません。


2
スケール関数のいずれかを見たことがありますか?scale_y_continuous多分?
joran 2013年

同様の質問に対するいくつかの回答を読み、scale_y_continuousが他の数値形式(科学的記数法など)から変換されたという印象を受けましたが、探していた実数から整数への変換には対応していませんでした。私は...誤解されるかもしれない
Atticus29

回答:


42

scale_y_continuous()および引数breaks=を使用すると、y軸のブレークポイントを表示する整数に設定できます。

ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15)) +
    geom_bar(position='dodge', colour='black')+
    scale_y_continuous(breaks=c(1,3,7,10))

45
このソリューションは、軸にどの値があるかがわかっている状況にのみ適しています。良い一般的な解決策ではありません。
swolf

4
後世への注意:geom_bary aestheticでは機能しなくなりました(に置き換えてくださいgeom_col)。そして、この例ではない一般的な解決策は、特定のではかなりの呼び出しn個のオリジナル問題を解決することができます(とハードコーディング休憩よりも柔軟である)ながら: q + geom_col(position='dodge', colour='black') + xlab('IR')+scale_fill_grey() + theme_bw() + scale_y_continuous('Frequency', breaks=function(x) pretty(x, n=6))
helmingstayを

73

scalesパッケージをお持ちの場合は、pretty_breaks()手動でブレークを指定しなくても使用できます。

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks= pretty_breaks())

17
これは、デフォルトの方法とほぼ同じように機能しているようで、ブレークにはまだ小数点がありました。
kory 2017年

どこpretty_breaks()から来たの?
マリアン


16
pretty_breaks()きれいですが、常に整数であるとは限りません。明らかに小数での美しさは...そこにある
PatrickT

51

これは私が使用するものです:

ggplot(data3, aes(x = factor(IR), y = value, fill = Legend, width = .15)) +
  geom_col(position = 'dodge', colour = 'black') + 
  scale_y_continuous(breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))))

これが最初の答えですが、説明者は大歓迎です。
DomQ

18

カスタムラベラーを使用できます。たとえば、この関数は整数ブレークのみを生成することを保証します。

int_breaks <- function(x, n = 5) {
  l <- pretty(x, n)
  l[abs(l %% 1) < .Machine$double.eps ^ 0.5] 
}

使用

+ scale_y_continuous(breaks = int_breaks)

これは、デフォルトのブレークを取り、整数であるブレークのみを保持することによって機能します。データの中断が少なすぎる場合は、次のように増やしますn

+ scale_y_continuous(breaks = function(x) int_breaks(x, n = 10))

これにより、0〜1.25のデータしかない場合、または何を持っている場合でも、整数1が失われます。x軸に0しか表示されません。
kory 2017年

1
簡単にするためにこれが好きです。n値の範囲によっては、微調整が必​​要になる場合があることに注意してください。それは(大まかに)いくつの休憩があるかを決定するようです。
マリアン

15

これらの解決策は私にはうまくいきませんでしたし、解決策を説明しませんでした。

関数のbreaks引数scale_*_continuousは、制限を入力として受け取り、ブレークを出力として返すカスタム関数で使用できます。デフォルトでは、連続データの場合、軸の制限は両側で5%拡張されます(データの範囲に対して)。この拡張により、軸の制限は整数値にならない可能性があります。

私が探していた解決策は、単に下限を最も近い整数に切り上げ、上限を最も近い整数に切り下げてから、これらのエンドポイント間の整数値でブレークを設定することでした。したがって、breaks関数を使用しました。

brk <- function(x) seq(ceiling(x[1]), floor(x[2]), by = 1)

必要なコードスニペットは次のとおりです。

scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1))

元の質問からの再現可能な例は次のとおりです。

data3 <-
  structure(
    list(
      IR = structure(
        c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L),
        .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"),
        class = "factor"
      ),
      variable = structure(
        c(1L, 1L, 1L, 1L,
          2L, 2L, 2L, 2L),
        .Label = c("Real queens", "Simulated individuals"),
        class = "factor"
      ),
      value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L,
                4L),
      Legend = structure(
        c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
        .Label = c("Real queens",
                   "Simulated individuals"),
        class = "factor"
      )
    ),
    row.names = c(NA,-8L),
    class = "data.frame"
  )

ggplot(data3, aes(
  x = factor(IR),
  y = value,
  fill = Legend,
  width = .15
)) +
  geom_col(position = 'dodge', colour = 'black') + ylab('Frequency') + xlab('IR') +
  scale_fill_grey() +
  scale_y_continuous(
    breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1),
    expand = expand_scale(mult = c(0, 0.05))
    ) +
  theme(axis.text.x=element_text(colour="black", angle = 45, hjust = 1), 
        axis.text.y=element_text(colour="Black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(), 
        axis.ticks.x = element_blank())

2
ここでのベストアンサー
マーティン

私はマーティンに同意します—完全に機能する例を提供する努力をしてくれてありがとう。Daniel Gardinerの答えは、軸の範囲が数百以上の場合に混乱を引き起こさない、より優れたブレーク機能を使用していることに気付きました。また、好みの問題として、別のbreaks_integers関数を定義して使用することは、初心者にとってより役立つと思います。ベスト、
DomQ

5

既存の回答はすべて、カスタム関数を必要とするか、場合によっては失敗するようです。

この行は整数の区切りを作成します。

bad_scale_plot +
  scale_y_continuous(breaks = scales::breaks_extended(Q = c(1, 5, 2, 4, 3)))

詳細については、ドキュメント?labeling::extended(によって呼び出される関数scales::breaks_extended)を参照してください。

基本的に、議論 Qは、アルゴリズムがスケールブレークに使用しようとする一連の適切な数値です。のデフォルト値にQは2.5が含まれているため、元のプロットは非整数のブレーク(0、2.5、5、および7.5)を生成しますQ = c(1,5,2,2.5,4,3)

編集:コメントで指摘されているように、y軸の範囲が狭い場合、整数以外のブレークが発生する可能性があります。デフォルトでbreaks_extended()は、n = 5休憩をとろうとしますが、範囲が小さすぎると不可能です。クイックテストでは、0 <y <2.5より広い範囲で整数のブレークが発生nすることが示されています(手動で減らすこともできます)。


3

グーグルは私をこの質問に連れて行った。実数をayスケールで使用しようとしています。yスケールの数値は百万単位です。

スケールのパッケージcomma方法を紹介コンマ私の大きな数字にします。R-Bloggersに関するこの投稿では、次の方法を使用した簡単なアプローチについて説明していcommaます。

library(scales)

big_numbers <- data.frame(x = 1:5, y = c(1000000:1000004))

big_numbers_plot <- ggplot(big_numbers, aes(x = x, y = y))+
geom_point()

big_numbers_plot + scale_y_continuous(labels = comma)

Rをお楽しみください:)


1
ここにある他の解決策は、実際にはうまくいかなかったか、途方もなく複雑に見えました。これは機能し、簡単に実行できました。
ブライアンドハティ

@BrianDohertyおかげで、シンプルさが...ほとんどの事のための鍵である
トニー・クローニン

2

Joshua Cookからこのソリューションを見つけて、かなりうまくいきました。

integer_breaks <- function(n = 5, ...) {
fxn <- function(x) {
breaks <- floor(pretty(x, n, ...))
names(breaks) <- attr(breaks, "labels")
breaks
}
return(fxn)
}

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks = integer_breaks())

ソースは次のとおりです:https//joshuacook.netlify.app/post/integer-values-ggplot-axis/


この関数は正解です。どれよりも簡単に動作します!
zdebruine

1

この回答は、@ Axemanの回答に基づいており、データが0から1に変化するだけの場合、1にブレークは表示されないという、koryによるコメントに対応しています。これは、pretty1と同じではないように見える出力の不正確さが原因のようです。1(最後の例を参照)。

したがって、使用する場合

int_breaks_rounded <- function(x, n = 5)  pretty(x, n)[round(pretty(x, n),1) %% 1 == 0]

+ scale_y_continuous(breaks = int_breaks_rounded)

0と1の両方がブレークとして表示されます。

Axemanとの違いを説明する例

testdata <- data.frame(x = 1:5, y = c(0,1,0,1,1))

p1 <- ggplot(testdata, aes(x = x, y = y))+
  geom_point()


p1 + scale_y_continuous(breaks = int_breaks)
p1 + scale_y_continuous(breaks =  int_breaks_rounded)

どちらも最初の質問で提供されたデータで機能します。

丸めが必要な理由の図

pretty(c(0,1.05),5)
#> [1] 0.0 0.2 0.4 0.6 0.8 1.0 1.2
identical(pretty(c(0,1.05),5)[6],1)
#> [1] FALSE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.