Molbiol.ru | О проекте | Справочник | Методы | Растворы | Расчёты | Литература | Орг.вопросы Web | Фирмы | Coffee break | Картинки | Работы и услуги | Биржа труда | Zbio-wiki NG SEQUENCING · ЖИЗНЬ РАСТЕНИЙ · БИОХИМИЯ · ГОРОДСКИЕ КОМАРЫ · А.А.ЛЮБИЩЕВ · ЗООМУЗЕЙ Темы за 24 часа [ Вход* | Регистрация* ] Форум: | |
bf109xxl Участник |
И еще. Для меня приемлемость того или иного средства часто определяется качеством литературы, благодаря которой это средство можно быстро и достаточно глубоко освоить. В случае ggplot-а таким источником для меня явилась книга Уинстона Чанга "
|
plantago Постоянный участник |
|
Ulvhare |
Конкретно для моих задач (exploratory analysis почти по Zuur et al., 2010 + немного дисперсионного, всё в Rmarkdown -> html + pdf + [odt -> doc]) ggplot в 99% случаев удобнее, т.к.:
Ну и да, субъективно мне привычнее ООП, поэтому-то код ggplot и легче воспринимать. Сам считаю, что Викхэм - гениальный извращенец, но мне оказалось проще "довести напильником" его творения, чем писать свои функции на основе base graphics. Опять же, plantago в своей книге предостерегает от циклов ;-) Для обучения R, наверное, классика лучше подходит, но это вне моей компетенции, а вот "ggplotminus" - это хорошая идея.
|
Алекс3212 |
(bf109xxl @ 11.01.2019 14:12) CODE ggplot(Weather.1, aes(x = <Date column name>, y = Prod, fill = Weath)) + geom_bar(stat = "identity") Вау!! Очень быстро. Все конечно получилось, спасибо большое. Жаль, что по моему основному виду деятельности нет таких форумов и отзывчивого сообщества. Как то, написал на один форум года 4 назад, до сих пор жду, может кто то ответит, хотя уже вопрос не актуальный |
Алекс3212 |
(bf109xxl @ 12.01.2019 21:55) Тратить время на изучение очередной системы визуализации в R, которая лучше соответствует идеологии этого продукта, я буду, если функционал будет не хуже, чем у ggplot-а, либо в ней будут некие важные функции, отсутствующие в ggplot (даже при менее обширном функционале в целом). И еще. Для меня приемлемость того или иного средства часто определяется качеством литературы, благодаря которой это средство можно быстро и достаточно глубоко освоить. В случае ggplot-а таким источником для меня явилась книга Уинстона Чанга " За ссылку на книгу, отдельная благодарность. Как раз искал что то по ggplot |
plantago Постоянный участник |
Хотя скорее имитирует внешний вид, а не кливлендские принципы.
|
bf109xxl Участник |
Хотя да, может уменьшить скрипт на несколько строк. Когда мне не лень, я "выкидываю" дефолтный дизайн ggplot-а, если он не требуется для облегчения восприятия, теперь это сделать проще. Поэтому - спасибо. |
Ulvhare |
(plantago @ 14.01.2019 21:27) Кстати, нечто похожее на "ggminus" уже имеется: Хотя скорее имитирует внешний вид, а не кливлендские принципы. Да-да-да, на её-то основе я и сварганил тему под МАИК-овские журналы Вот интересно, для базовой графики создать тему можно (цвета - визуально различающиеся grayscale, толщина линий, сетки, шрифты, легенды)? |
plantago Постоянный участник |
Где взять? |
ПолинаШ Участник |
Есть исходный DF1 Фактор Среднее 1 A 14.500 2 B 15.330 3 C 2.083 4 D 4.917 5 E 3.500 6 F 16.670 Нужно получить DF2 для каждого значения фактора, где rs =rnorm(100, DF1$Среднее, sd=1) фактор rs 1 A 15.85653 2 A 15.95480 3 A 14.96506 4 A 14.73295 5 A 13.67393 |
ПолинаШ Участник |
f <- rep(DF1$Фактор,100)
rs <- rep(rnorm(6, DF1$Среднее),100) DF2 <- data.frame(f,rs)
|
Алекс3212 |
1. как добавить индивидуальную линию к каждому VibNo, а не общую для всех VibNo рассчитанную по всему столбцу? library("ggplot2") # загрузка библиотеки для графиков library(readxl) # загрузка библиотеки для импорта Excel APS <- read_xlsx("0123aps.xlsx") #загрузка и сохранение в базе файла APS$VibNo <- as.factor(APS$VibNo) # создание фактора ggplot(APS, aes(x=VibNo, y=AveragePhase, color= VibNo))+ geom_jitter() + geom_hline(yintercept = median(APS$AveragePhase)) + ggtitle("Average Phase") + ylab("Значение")+xlab("Номер УВСС") 2. Как я могу изменить гистограмму так, чтобы отображалось не количество по y , а %. Посмотрел в литературе написано что нужно дописать type ="percent", но или я не туда дописываю эту команду или это не правильно. library(readxl) # загрузка библиотеки для импорта Excel COG <- read_xlsx("COG 0123.xlsx") old.par <- par(mfrow=c(1,2)) hist(COG$COG, main= "COG,m", xlab= "Метры", ylab = "Количество", col = "grey") boxplot(COG$COG, main= "COG,m", ylab= "Метры", col = "grey") par(old.par) # fineshed code 3. Как я могу отобразить на гистограмме легенду и как сделать так, чтобы данные по x (часы) отображались по порядку от 0 до 24, потому что по умолчанию сначала все 1, т.е. 1 10 11 и тд потом 2 20 21 и потом 3 4 5 и тд. Timestat <- read_xlsx("G:/WorkU/06 Учет работ/статистика.xlsx") Timestat Timestat$time <- as.factor(Timestat$time) ggplot(Timestat, aes(x=as.character(time), y=ff))+ geom_bar(stat = "identity") + xlab("Часы") + ylab("Количество ф.н.") Всем заранее спасибо за любые советы и помощь Сообщение было отредактировано Алекс3212 - 25.01.2019 09:33 Картинки: Screenshot_1.png — (44.37к) Screenshot_3.png — (24.3к) |
plantago Постоянный участник |
гистограмма: hh <- hist(trees[, 1], plot=FALSE) hh$counts <- 100*hh$counts/sum(hh$counts) plot(hh) # теперь оно в процентах |
Алекс3212 |
(plantago @ 24.01.2019 21:39) ggplot не люблю, но тут найдутся, я надеюсь, любители гистограмма: hh <- hist(trees[, 1], plot=FALSE) hh$counts <- 100*hh$counts/sum(hh$counts) plot(hh) # теперь оно в процентах Возможно я слишком усложнил и сузил задачу, чуть проше думаю можно, насчет 1 вопроса. Может быть я могу количественно получить те же самые значения. У меня есть около 8 столбцов, представим это как разные лекарства. Все строки относятся к пациентам, пациентов 10 и после каждого приема лекарства на протяжении 20 лет записываются показатели ну скажем давления. Таким образом строк более 100 000. Как я могу получить среднее, медиану, максимальные значения (то, что есть в summary) по каждому отдельному пациенту после приема каждого из 8 лекарств? Я имею ввиду, чтобы получить примерно в таком виде: пациент- summary за все время наблюдения давление после приема лекарства 1, отдельно 2 и тд. По второму пациенту аналогично. Всем заранее спасибо за любую помощь. |
bf109xxl Участник |
CODE <pat> <d1>...<d8> <date> где в колонке pat ID пациента, в колонках "d1"-"d8" - значения параметра после приема соотв. препарата, "date" - понятно, в колонках для неприменявшихся в этот день препаратов должно стоять NA. Потом с помощью melt() из {reshape} переводите в удобоваримую форму: CODE data.mltd <- melt(data, id=c("pat", "date"), na.rm=TRUE) Получится таблица data.mltd вида: CODE <pat> <date> <variable> <value>. Если пациент в день принимал лишь по одному препарату, то сразу создавать таблицу в этом формате (variable содержит ID препарата, а value - значение параметра). После чего можно применять tapply(), например: CODE tapply(data.mltd$value, list(data.mltd$pat, data.mltd$variable), mean) Сообщение было отредактировано bf109xxl - 27.01.2019 19:07
|
bf109xxl Участник |
(Алекс3212 @ 24.01.2019 13:34) 3. Как я могу отобразить на гистограмме легенду и как сделать так, чтобы данные по x (часы) отображались по порядку от 0 до 24... Убрать вот это: CODE Timestat$time <- as.factor(Timestat$time) Зачем оно вообще понадобилось? Сообщение было отредактировано bf109xxl - 27.01.2019 16:35
|
Ulvhare |
(plantago @ 15.01.2019 19:58) Малость перепутал, всё-таки на основе theme_classic из самого пакета ggplot2: CODE theme_set(theme_classic(base_size = 10, base_family = "Newton")) + theme_update(axis.text = element_text(colour = "black"), axis.ticks = element_line(colour = "black"), axis.title = element_text(size = 8), strip.text = element_text(colour = "black"), strip.background = element_rect(colour = "white")) Шрифт "Newton" экспроприируется и национализируется на просторах интернета, если проблематично, по метрикам более-менее подходят всякие Times-подобные, например, мой любимый FreeSerif (ttf-вариант обычно есть в репах/портежах дистрибутива, otf - в TexLive). Для шрифтов может понадобиться пакет Можно сохранить как отдельную тему, но мне всегда было лень. С применением этой темы редакторы/верстальщики Известий РАН (серия биологическая) практически перестали издеваться над моими графиками ;-) ЗЫ: Извинямс за замедленную реакцию, весь в литературе по поводу своего последнего вопроса. ЗЗЫ: Есть ещё .rmd .tex шаблоны для ИзвРАН сер.биол., preprint - чтобы прикинуть, как оно будет смотреться, если возьмут, man - для распечатки в редакцию (задолбало вручную библиографию править). Если надо, могу выложить. Сообщение было отредактировано Ulvhare - 01.02.2019 20:42
|
Алекс3212 |
(bf109xxl @ 27.01.2019 17:35) Да вы правы, оно оказалось незачем, вот код с которым я получил то, что нужно по порядку. ggplot(Timestat1, aes(x=Tim1, y=ff))+ geom_bar(stat = "identity") + xlab("Часы") + ylab("Количество ф.н.") Пока у меня мало знаний в R и часть пробелов, если я не знаю как, я заполняю опытным путем в том числе и с других задач используя части кода. Это конечно не по "научному" и приводит вот к таким нелепым ошибкам, но зато довольно быстро и практично, когда нет времени на работе. На счет предыдущего ответа, пока не понял с ходу, но спасибо за ответ, буду разбираться используя ваш комм-ий Сообщение было отредактировано Алекс3212 - 08.02.2019 22:54 |
bf109xxl Участник |
(Ulvhare @ 01.02.2019 19:36) С применением этой темы редакторы/верстальщики Известий РАН (серия биологическая) практически перестали издеваться над моими графиками ;-) Я слегка не просекаю, а что верстальщик может сделать с графиком-то? Оные должны воспроизводиться без каких-либо манипуляций со шрифтами и прочим. Я не в курсе, конечно, какие порядки в ИзвРАНе, но до сих пор с подобным волюнтаризьмом в "буржуйских" научных журналах сталкиваться не доводилось. ЗЫ. Для научной публикации я бы забацал темплату в Origin-е. В нем теперь доступны вставки LaTeX-формул и есть интерфейс с R. Чем я активно пользуюсь - это чтобы не обвинили в офф-топике. В общем, почти идеал системы для сложной интерактивной обработки и визуализации не очень больших данных получается... |
plantago Постоянный участник |
А я бы не. Как я в 2010 году решил сократить до минимума использование проприетарного софта, так с тех пор и живу практически без всех этих штучек. Даже честно купленным фотошопом пользоваться перестал. Но публикуюсь как-то. Use R! |
bf109xxl Участник |
(plantago @ 18.02.2019 23:57) Как я в 2010 году решил сократить до минимума использование проприетарного софта, так с тех пор и живу практически без всех этих штучек. А зачем сокращать использование проприетарного софта, если оный упрощает и ускоряет работу? Не понимаю... Экономия на спичках... Use R! Так R я и в Origin использую Либо через встроенную спец-консоль, либо через специальный объект LabTalk-а - о чем и речь была, собственно. |
plantago Постоянный участник |
Это не экономия, а принцип. Pickwick and principle! А вообще почитайте Столлмана, если еще не. Впрочем, все это почти оффтопик. |
bf109xxl Участник |
(plantago @ 19.02.2019 08:04) Я такие принципы не вполне понимаю. Точнее, я понимаю там, где это оправдано, а в данном случае (п/о преимущественно для научных задач) - скорее, это вредный принцип. Есть немало проприетарных программ, которые невозможно заменить фришным (ок, GNU и т.п.) софтом без [сильной] потери в качестве. Что для меня гораздо принципиальнее. Я за плюрализм. |
PS2004R Постоянный участник |
(bf109xxl @ 19.02.2019 10:56) За тролоо скорее
|
bf109xxl Участник |
(PS2004R @ 19.02.2019 10:10) Это по вашей части. Тут вы спицыялизд, адназначна. |
plantago Постоянный участник |
Помянутый разными словами выше Wickham написал (еще в прошом году, а сегодня обновил) очень правильный пакет -- Очень уж неприятная проблема время от времени возникает из-за троеточия, в этом треде были примеры. Кажется, этот пакет решает проблему хотя бы частично. |
PS2004R Постоянный участник |
(plantago @ 19.02.2019 12:53) Переменим тему Помянутый разными словами выше Wickham написал (еще в прошом году, а сегодня обновил) очень правильный пакет -- Очень уж неприятная проблема время от времени возникает из-за троеточия, в этом треде были примеры. Кажется, этот пакет решает проблему хотя бы частично. Это хорошо когда писатели пакетов используют. Но они будут крайне недовольны появлением такой функции в виде зависимости от стороннего пакета. Такое автору надо предлагать в {base}. |
plantago Постоянный участник |
|
Den-N Постоянный участник |
Прикрепил вордовский файл с данными (проблемный и беспроблемный датасет) и кодом R. PS А может и не с нулевой корреляцией связано: corMat1<-round(corMat, digits=3) #округлил значения в матрице корреляций corMat<- replace(corMat1, corMat1==0, 0.001) # заменил вручную ноль на 0,001 В результате имею такой же некорректный график с одинаковыми линиями. Пакет неверно толщину рёбер считает: > Graph_pcor From To Weight 1 --- 2 0.83 1 --- 3 -0.89 2 --- 3 0.85 1 --- 4 0.9 2 --- 4 -0.92 3 --- 4 0.96 1 --- 5 -0.77 2 --- 5 0.8 3 --- 5 -0.86 4 --- 5 0.89 1 --- 6 0.86 2 --- 6 -0.83 3 --- 6 0.97 4 --- 6 -0.95 5 --- 6 0.9 1 --- 7 -0.88 2 --- 7 0.87 3 --- 7 -0.87 4 --- 7 0.92 5 --- 7 -0.8 6 --- 7 0.89 > Сообщение было отредактировано Den-N - 15.03.2019 10:48 Файл/ы:
|
PS2004R Постоянный участник |
qgraph(corMat, graph= "pcor", layout="circle", minimum=0.01, maximum=1) |
Den-N Постоянный участник |
(PS2004R @ 15.03.2019 13:50) Благодарю за помощь! Сам нашёл ошибку в коде. Помогло ?qgraph )) В коде нужно не graph= "pcor", а graph= "cor" Иначе строит частные (partial) корреляции, а с ними непонятно что вообще выходит Сообщение было отредактировано Den-N - 15.03.2019 11:24 |
guest: ivan IP-штамп: fr0dFkPJ4Kizg гость |
|
PS2004R Постоянный участник |
(guest: ivan @ 02.05.2019 18:02) Это пакет igraph |
mytarmail Участник |
Подскажите пожалуйста как строятся такие графики в анализе главных компонент На сколько я понял там как то сравниваеться кф. корреляции между двумя векторами но как я не знаю, может кто то показать кодом как строить такие графики Сообщение было отредактировано mytarmail - 16.06.2019 17:06 |
ПолинаШ Участник |
Что-нибудь есть похожее в R или дифференцировать вручную? |
plantago Постоянный участник |
|
d-taras |
Есть очень большая таблица вида CODE ID; X; Y; wateronly06 1;329449.0902600000;5671886.0910999998;0.6234206557 7;329509.0628400000;5671886.0910999998;0.0150682973 8;329519.0582700000;5671886.0910999998;0.0000000000 76099;326440.4658800000;5673185.4970000004;-0.0079722088 Её надобно разбить на 7 самостоятельных таблиц с интервалом - до 0; 0; >0 &<0.2; и т.д. до 0,8-1,0 Делаю CODE tab_00 <- subset(tab_0, wateronly06 = 0, select=c(X, Y, wateronly06)) ] Получаю CODE Ошибка: неожиданный '=' in "tab_0 <- subset(tab, tab$wateronly06 =" С чем это связано? Причем остальные формулы сортировки работают CODE tab_00 <- subset(tab, tab$wateronly06 <0, decreasing=T, select=c(X, Y, wateronly06)) tab_02 <- subset(tab, Tab$wateronly06 > 0 & wateronly06 < 0.2, select=c(X, Y, wateronly06)) И вторая просьба. Как оформить сортировку дабы запускалась одной командой. Таких файлов будет не один или два. Сообщение было отредактировано d-taras - 16.08.2019 14:32 |
ПолинаШ Участник |
После установки из дурного любопытства одного из ненужных пакетов (tidyverse) перестала загружаться библиотека ggplot2 и пакеты с ней связанные (тот же caret) > library(ggplot2) Error in readRDS(pfile) : cannot read workspace version 3 written by R 3.6.1; need R 3.5.0 or newer Пробовала установить R-3.6.1-win.exe - не получается (якобы "не является приложением Win32"). Граната перестала быть нужной системы. Пробовала переустановить ggplot2 - не получается, т.к. не найду нужного zipА. Есть вариант - выкинуть нетбук. А есть что-нибудь либеральнее? |
plantago Постоянный участник |
А тут? Или даже |
ПолинаШ Участник |
Об этой ошибке идет обсуждение в инет, например Но мой браузер эту страницу открывать не хочет ("Ошибка при установлении защищённого соединения"). А кстати, как с эти бороться? Но конкретной рекомендации нет. |
plantago Постоянный участник |
|
bf109xxl Участник |
CODE for (id in df$id) { df$x <- min(df$id[df$a == df$a[df$id == id] & df$b == df$b[df$id == id]]) } ? Т.е., в колонку x таблицы df должно заноситься минимальное значение колонки id из всех строк c одинаковыми значениями колонок a и b. Буду признателен за подсказку. Сообщение было отредактировано bf109xxl - 25.09.2019 14:46 |
Guest IP-штамп: frN3LPP7lqWa2 гость |
(bf109xxl @ 25.09.2019 14:04) Т.е., в колонку x таблицы df должно заноситься минимальное значение колонки id из всех строк c одинаковыми значениями колонок a и b. Буду признателен за подсказку. CODE > tapply(df[df$a==df$b,]$id, df[df$a==df$b,]$a , max, simplify = F ) $`1` [1] 1 $`2` [1] 3 > tapply(df[df$a==df$b,]$id, df[df$a==df$b,]$a , min, simplify = F ) $`1` [1] 1 $`2` [1] 2 > df id a b 1 1 1 1 2 2 2 2 3 3 2 2 4 4 3 6 5 5 4 8 6 6 5 10 7 7 6 12 8 8 7 14 9 9 8 16 10 10 9 18 |
DSV2015 |
X1 X2 X3 1 3 5 2 4 6 3 5 7 Как это можно сделать? CODE plus <- function(a, b) { return(a + b) } x <- 1:3 n <- 2 DF <- data.frame(matrix(nrow = length(x),ncol=n+1)) DF$X1 <- x DF |
PS2004R Постоянный участник |
(DSV2015 @ 10.10.2019 08:27) Нужно применить к вектору x свою функцию n раз и записать начальный и промежуточные результаты в датафрейм. Для примера напишем функцию plus и будем прибавлять 2 на каждом шаге. Должно получится: X1 = исходный вектор, X2 = X1 + 2, X3 = X2 + 2 X1 X2 X3 1 3 5 2 4 6 3 5 7 CODE > sapply(1:3, function(i) Reduce(function(x1,x2) x1+2, i*1:3, accumulate = T)) [,1] [,2] [,3] [1,] 1 2 3 [2,] 3 4 5 [3,] 5 6 7
|
DSV2015 |
Не получается. Нужно иметь возможность в первом блоке задавать любую свою или пр. функцию и аргументы, во втором исполняемом(sapply(a, ...) ничего не трогая. Не даются мне сложные вложения. CODE plus <- function(a, b) a + b # своя или иная функция a <- 1:4 # входной вектор b <- 3 # второй аргумент sapply(a, ..... ? # исполняемый блок |
PS2004R Постоянный участник |
(DSV2015 @ 11.10.2019 10:20) PS2004R Не получается. Нужно иметь возможность в первом блоке задавать любую свою или пр. функцию и аргументы, во втором исполняемом(sapply(a, ...) ничего не трогая. Не даются мне сложные вложения. CODE plus <- function(a, b) a + b # своя или иная функция a <- 1:4 # входной вектор b <- 3 # второй аргумент sapply(a, ..... ? # исполняемый блок CODE > get.conv <- function(s,f = function(x1,x2) x1+2) { + j <- 1:(length(s)) + t(sapply(s, function(i) Reduce(f, i*j, accumulate = T))) + } > get.conv(1:3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [3,] 3 5 7 > get.conv(1:3, function(x1,x2) x1+0.5*x1) [,1] [,2] [,3] [1,] 1 1.5 2.25 [2,] 2 3.0 4.50 [3,] 3 4.5 6.75 Сообщение было отредактировано PS2004R - 11.10.2019 17:56
|
DSV2015 |
Осталась одна проблема с пустыми значениями. Нужно что бы в случае появления пустого значения в процессе выполнения своей функции они игнорировались и строки просто заполнялась NA. При наличии NA в исходном векторе работает корректно, но при появлении NA в свой функции, например лага(fnc2), все ломается. CODE get.conv <- function(s,f = fnc) { j <- 1:(n+1) t(sapply(s, function(i) Reduce(f, i*j, accumulate = T))) } fnc1 <- function(x1,x2) x1 + x1 # своя или иная функция fnc2 <- function(x1,x2) x1 + c(NA, head(x1, -1)) x <- c(NA, 1:4) # исходный вектор n <- 3 # выполнить n раз data.frame(get.conv(x, fnc1)) data.frame(get.conv(x, fnc2)) |
PS2004R Постоянный участник |
(DSV2015 @ 12.10.2019 10:31) PS2004R CODE get.conv <- function(s,f = fnc) { j <- 1:(n+1) t(sapply(s, function(i) Reduce(f, i*j, accumulate = T))) } f У вас неработающий код написан. Объясните чем вас не устраивает поведение по умолчанию. NA возвращаются. CODE > get.conv <- function(s,f = function(x1,x2) x1+2) { + j <- 1:(length(s)) + t(sapply(s, function(i) Reduce(f, i*j, accumulate = T))) + } > get.conv(1:3, function(x1,x2) x1+0.5*x1) [,1] [,2] [,3] [1,] 1 1.5 2.25 [2,] 2 3.0 4.50 [3,] 3 4.5 6.75 > get.conv(c(1,NA,3), function(x1,x2) x1+0.5*x1) [,1] [,2] [,3] [1,] 1 1.5 2.25 [2,] NA NA NA [3,] 3 4.5 6.75 |
DSV2015 |
C NA в исходном векторе работает хорошо. Но если взять исходный вектор без NA(чтобы не путаться) и прибавлять к x1 не 0.5*x1, а лаг от x1(при сдвиге появляется NA), то не работает. CODE > get.conv <- function(s,f = function(x1,x2) x1+2) { + j <- 1:(length(s)) + t(sapply(s, function(i) Reduce(f, i*j, accumulate = T))) + } > > x <- 1:3 # исходный вектор x > Lag1x <- c(NA, head(x, -1)) # лаг от x(появляется NA при сдвиге) > x; Lag1x [1] 1 2 3 [1] NA 1 2 > > get.conv(x, function(x1,x2) x1 + 0.5*x1) [,1] [,2] [,3] [1,] 1 1.5 2.25 [2,] 2 3.0 4.50 [3,] 3 4.5 6.75 > get.conv(x, function(x1,x2) x1 + c(NA, head(x1, -1))) [,1] [,2] [,3] [1,] 1 NA NA [2,] 2 NA NA [3,] 3 NA NA |
« Предыдущая тема · Биофизика и матметоды в биологии · Следующая тема » |