Не хочу наукових позначень на осі ділянки


75

Я регулярно роблю всілякі розкидання графіків у R, використовуючи plotкоманду.

Іноді обидві, іноді лише одна з осей сюжету позначена в наукових позначеннях. Я не розумію, коли R приймає рішення про перехід до наукових позначень. Дивно, але він часто друкує цифри, які жоден здоровий розум не написав би в наукових позначеннях, позначаючи сюжет, наприклад, він позначає 5 як 5e + 00. Скажімо, у вас вісь журналу до 1000, наукові позначення невиправдані такими "малими" цифрами.

Я хотів би придушити таку поведінку, я завжди хочу, щоб R відображав цілі значення. Чи можливо це?

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

Я використовую R 2.12.1 у Windows 7.


Там більше рад щодо форматування чисел в stackoverflow.com/questions/5812493 / ...
Richie Cotton

Відповіді:


55

Використовуйте options(scipen=5)або якусь іншу досить високу цифру. Параметр scipen визначає, наскільки ймовірним є перехід R на наукові позначення, чим вище значення, тим менша ймовірність переключення. Встановіть варіант перед створенням вашого сюжету, якщо він все ще має наукові позначення, встановіть його на більше число.


3
Якби ви насправді прочитали моє оригінальне запитання, ви б прочитали, що "я спробував варіанти (scipen = 10), але тоді він починає писати 5.0 замість 5". І що я хочу, щоб цифри були записані як 5, а не 5,0 тощо.

@gojira Але чи ви пробували інші цінності scipen? Ви пробували scipen=5?
Марек

Ви маєте рацію, я сумував, що ви це вже пробували. Інші зазначають, що ви можете використовувати функцію осі, щоб точно розмістити те, що ви хочете, за допомогою функцій, таких як format, sprintf і досить.
Грег Сноу

19

Ви можете скористатися formatабо, formatCщоб, відформатувати мітки осей.

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

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

Якщо числа конвертовані у фактичні цілі числа (тобто не надто великі), ви можете також використовувати

formatC(x, format = "d")

Спосіб розміщення міток на вашій осі залежить від системи побудови графіків, яку ви використовуєте.


1
Це не особливо корисно, оскільки ОП вже заявляло, що вони використовуютьplot()
Пітер Елліс,

@PeterEllis Як це не корисно? Якщо використання plottou отримало контроль над віссю, див. Іншу відповідь у цій темі: stackoverflow.com/a/5968136/168747 (рядок починається з axis(.
Marek,

12

Для цього можна використовувати 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)

дає:

введіть тут опис зображення

EDIT: якщо ви хочете, щоб усі вони були в одному форматі, ви можете скористатися рішенням @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))

Я просто мав ідею використовувати вісь та рядки замість цифр, щоб отримати "чисті цілі числа" (тобто цитувати цифри ")?
Генрік,

@Henrik: також працює, але ідея використання формату полягає в тому, що ви можете вказати один вектор як для позиції, так і для міток. І ви можете використовувати його повторно для різних ділянок. Я підкоригував свій код, щоб показати це.
Джоріс Мейс,

У rstudio, якщо ви імпортуєте набір даних і виконуєте train_sample_10k = формат (train_sample_10k, Scientific = FALSE) та перезавантажуєте, це змінить наукові позначення.
mixdev

@mixdev Очевидно. Якщо перевірити ?format, ви побачите, що він повертає рядок символів із позначеннями. При перезавантаженні ви перезаписуєте рядок символів вихідними значеннями. format()не встановлює якийсь атрибут формату, він генерує текст. Звідси використання як значення для аргументуlabels
Джоріс Мейс

1
Як я ніколи не бачив scientific = FALSEчастини цієї відповіді / документації до того, як 😭 змінюється format(x, scientific = FALSE, trim = TRUE, big.mark = ',')життя
MichaelChirico

11

Спробуйте це. Я навмисно розбив різні деталі, щоб ви могли пересувати речі.

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")

введіть тут опис зображення


4

Ви можете спробувати грати :

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

введіть тут опис зображення


2

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'))

У функції також є logпараметр, axTicksале в цій ситуації його не потрібно встановлювати, щоб отримати правильне місце галочки логарифмічної осі.


-2

Зазвичай достатньо встановити межу осі @ max вашої змінної

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

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

Ні, це не так, і ваша відповідь не заважає пояснити, як це мало би якийсь ефект.
Бред Соломон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.