Не хотите научного обозначения на оси сюжета - PullRequest
64 голосов
/ 11 мая 2011

Я регулярно делаю все виды точечных диаграмм в R, используя команду plot.

Иногда обе, иногда только одна из осей сюжета помечаются в научных обозначениях. Я не понимаю, когда R принимает решение перейти к научной записи. Удивительно, но он часто печатает числа, которые ни один здравомыслящий человек не напишет в научной нотации при маркировке графика, например, он помечает 5 как 5e + 00. Допустим, у вас есть логарифмическая ось, доходящая до 1000, научная запись неоправданна такими «маленькими» числами.

Я хотел бы подавить такое поведение, я всегда хочу, чтобы R отображал целочисленные значения. Это возможно?

Я попытался options(scipen=10), но затем он начинает писать 5.0 вместо 5, в то время как на другой оси 5 все еще 5 и т. Д. Как я могу иметь чистые целочисленные значения в моих графиках R?

Я использую R 2.12.1 в Windows 7.

Ответы [ 7 ]

48 голосов
/ 11 мая 2011

Используйте options(scipen=5) или другое достаточно высокое число.Опция scipen определяет, насколько вероятно, что R переключится на научную нотацию: чем выше значение, тем меньше вероятность переключения.Установите параметр перед построением графика, если он все еще имеет научную запись, установите для него более высокое число.

17 голосов
/ 11 мая 2011

Вы можете использовать format или formatC, чтобы, хм, отформатировать метки оси.

Для целых чисел попробуйте

x <- 10 ^ (1:10)
format(x, scientific = FALSE)
formatC(x, digits = 0, format = "f")

Если числа могут быть преобразованы в действительные целые числа (т.е. не слишком большие), вы также можете использовать

formatC(x, format = "d")

Способ нанесения надписей на оси зависит от используемой вами системы печати. ​​

11 голосов
/ 11 мая 2011

Попробуй это.Я специально разбил различные части, чтобы вы могли перемещать вещи.

library(sfsmisc)

#Generate the data
x <- 1:100000
y <- 1:100000

#Setup the plot area
par(pty="m", plt=c(0.1, 1, 0.1, 1), omd=c(0.1,0.9,0.1,0.9))

#Plot a blank graph without completing the x or y axis
plot(x, y, type = "n", xaxt = "n", yaxt="n", xlab="", ylab="", log = "x", col="blue")
mtext(side=3, text="Test Plot", line=1.2, cex=1.5)

#Complete the x axis
eaxis(1, padj=-0.5, cex.axis=0.8)
mtext(side=1, text="x", line=2.5)

#Complete the y axis and add the grid
aty <- seq(par("yaxp")[1], par("yaxp")[2], (par("yaxp")[2] - par("yaxp")[1])/par("yaxp")[3])
axis(2, at=aty, labels=format(aty, scientific=FALSE), hadj=0.9, cex.axis=0.8, las=2)
mtext(side=2, text="y", line=4.5)
grid()

#Add the line last so it will be on top of the grid
lines(x, y, col="blue")

enter image description here

11 голосов
/ 11 мая 2011

Для этого можно использовать команду axis(), например:

x <- 1:100000
y <- 1:100000
marks <- c(0,20000,40000,60000,80000,100000)
plot(x,y,log="x",yaxt="n",type="l")
axis(2,at=marks,labels=marks)

дает:

enter image description here

РЕДАКТИРОВАТЬ: если вы хотите, чтобы всеиз них в том же формате, вы можете использовать решение @Richie, чтобы получить их:

x <- 1:100000
y <- 1:100000
format(y,scientific=FALSE)
plot(x,y,log="x",yaxt="n",type="l")
axis(2,at=marks,labels=format(marks,scientific=FALSE))
4 голосов
/ 11 мая 2011

Вы можете попробовать решетка :

require(lattice)
x <- 1:100000
y <- 1:100000
xyplot(y~x, scales=list(x = list(log = 10)), type="l")

enter image description here

0 голосов
/ 21 марта 2016

Пакет R graphics имеет функцию axTicks, которая возвращает местоположения тиков, которые будут автоматически установлены функциями axis и plot. Другие ответы на этот вопрос определяют места для отметок вручную, что может быть неудобно в некоторых ситуациях.

myTicks = axTicks(1)
axis(1, at = myTicks, labels = formatC(myTicks, format = 'd'))

Минимальным примером будет

plot(10^(0:10), 0:10, log = 'x', xaxt = 'n')
myTicks = axTicks(1)
axis(1, at = myTicks, labels = formatC(myTicks, format = 'd'))

В функции axTicks также есть параметр log, но в этом случае его не нужно устанавливать для получения правильного положения тика логарифмической оси.

0 голосов
/ 01 октября 2013

Обычно достаточно установить предел оси @ max вашей переменной

a <- c(0:1000000)
b <- c(0:1000000)

plot(a, b, ylim = c(0, max(b)))
...