101

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

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軸に整数のみを表示したい。これが丸めによって達成されるのか、より洗練された方法によって達成されるのかは、私にとってそれほど重要ではありません。

4

10 に答える 10

96

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

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks= pretty_breaks())
于 2014-12-16T00:57:08.483 に答える
61

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

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)))))
于 2016-10-05T14:41:48.670 に答える
46

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))
于 2013-03-25T18:39:36.077 に答える
23

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

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))
于 2017-07-03T13:37:10.677 に答える
19

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

関数の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())
于 2019-02-13T20:27:02.460 に答える
7

またはのaccuracy引数を使用できます。scales::label_number()scales::label_comma()

fakedata <- data.frame(
  x = 1:5,
  y = c(0.1, 1.2, 2.4, 2.9, 2.2)
)

library(ggplot2)

# without the accuracy argument, you see .0 decimals
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::comma)

# with the accuracy argument, all displayed numbers are integers
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = ~ scales::comma(.x, accuracy = 1))

# equivalent
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_comma(accuracy = 1))

# this works with scales::label_number() as well
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_number(accuracy = 1))

reprexパッケージ(v2.0.0.9000)によって2021-08-27に作成されました

于 2021-08-27T11:15:54.327 に答える
6

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/

于 2020-06-11T09:25:51.187 に答える
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手動で減らすこともできます)。

于 2020-05-20T16:23:38.637 に答える
4

この回答は、@ Axemanの回答に基づいており、データが0から1までの場合、1でブレークは表示されないという、koryによるコメントに対応していますpretty。 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
于 2019-07-18T02:24:45.803 に答える
4

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

scalesパッケージcommaメソッドは、私の大きな数にコンマを導入しますR-Bloggerに関するこの投稿では、次の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をお楽しみください:)

于 2019-09-13T11:22:44.033 に答える