stat identity что это

RMarkdown, R и ggplot

Данная статья не является ни документацией, ни рассказывает что-то принципиально новое, её стоит рассматривать как обзорную или как шпаргалку.

Преамбула

Конференция это прежде всего доклады, и далеко не последнее место занимает то, как оформлены слайды доклада.

Безусловно, есть докладчики, которые могут не смотря ни на что, провести доклад даже без единого слайда, но всё же они как правило хорошо дополняют повествование. Одним достаточно накидать мемасиков в доклад и дело готово, другим обязательно надо вставить код, причём на ассемблере (кто не в курсе ещё — JPoint — это конференция по java), и есть ещё те, кому надо показать графики. Впрочем, встречается и их комбинация.

Пожалуй известные средства для создания слайдов это:

И если первые два по своей сути представляют бинарные форматы, а облачные Google Slides и ко ещё требуют наличие интернета, что является некоторым неприятным ограничением (во время поездок и перелётов), то последние два — и оффлайновые, и исключительно текстовые, а значит можно хранить историю всех изменений в git/hg/на ваш вкус. Кроме того, область применения далеко не ограничена только слайдами.

LaTeX формат с историей — много написано и сказано, а вот RMarkdown молодой, даже немного хипстерский, но без подворотов.

Markdown

Markdown это облегченный язык разметки, созданный с целью написания максимально читаемого и удобного для правки текста. Markdown является и лёгким для понимания, и легким для чтения даже без каких-либо трансформаций.

Сравните сами: _курсив_ это курсив, **сильное выделение** это сильное выделение, и многое другое — более подробно описано в Markdown cheatsheet.

Markdown поддерживают github, habrahabr, sublime, jira (имеет схожий синтаксис), и многие другие.

R — язык программирования для статистической обработки данных и работы с графикой.

Как правило это останавливает — это очень сложно, это математика, и это не надо — но никто же заставляет использовать всю доступную функциональность, пожалуй самый простой и наглядный — это графики и визуализация.

Хотя часто для того, чтобы построить какой-либо график используют Excel, он с большим трудом справляется, когда количество данных приближается уже к миллиону. Тогда как для R это не является какой-то сложной задачей.

Данные и графики

Оставим за кадром баталию, что же лучше — таблицы или графики. Вопрос вкуса.

Для построения графиков используем расширение ggplot2.

Дополнено: Нам необходим сам R и RStudio, например для MacOS / Homebrew:

$ brew tap homebrew/science
$ brew install r
$ brew сask install rstudio

устанавливаем модуль в RStudio для R :

Но чтобы строить графики нужны данные, и разумно хранить их отдельно от представления, например, в csv формате — опять же — простой текстовый формат.

Мои данные — это результаты полученные при помощи jmh для моего доклада Внутрь VM сквозь замочную скважину hashCode. Мне нравится стиль, используемый Алексеем Шипилёвым: записывать результаты benchmark’а в виде комментария в начале файла — grep-n-sed и мы имеем csv-файл.

Формируем таблицу данных (data frame) из csv-файла — по-умолчанию, считается, что в файле есть заголовок — это нам поможет при обращении к отдельным колонкам

если хотим отфильтровать, н-р, по конкретным значениям в колонке alloc

Бары / столбики

Для начала необходимо задать схему соответствия переменных (aes) из таблицы данных — отображать будем значение от типа, в нашем случае типа аллокации, цвет бара будет выбран также на основе типа аллокации.

Отображать будем в виде столбиков ( bar chart ) + geom_bar()

результат:

повернём систему координат (из вертикальных в горизонтальные бары) опцией + coord_flip()

добавим ошибку изменений + geom_errorbar() (помните, у нас в csv-файле есть колонка error):

для наглядности стоит добавить значения рядом с баром + geom_text() (логично, что текстом будет value)

добавим лоска подписи + geom_text():

изменим размер шрифта size и начертание fontface подписи

ggplot(data=df, aes(x=alloc, y=value, fill=alloc)) +
geom_bar(stat=»identity») +
coord_flip() +
geom_errorbar(aes(ymin = value — error, ymax = value + error), width=0.5, alpha=0.5) +
geom_text(aes(label=base::sprintf(«%0.2f ± %0.2f», value, error)), hjust=-0.1, vjust=-0.4, size=5, fontface = «bold»)

ggplot(data=df, aes(x=alloc, y=value, fill=alloc)) +
geom_bar(stat=»identity») +
coord_flip() +
geom_errorbar(aes(ymin = value — error, ymax = value + error), width=0.5, alpha=0.5) +
geom_text(aes(label=base::sprintf(«%0.2f ± %0.2f», value, error)), hjust=-0.1, vjust=-0.4, size=5, fontface = «bold») +
labs(title = «@Threads( 4 )», x = «», y = «ns/op») +
theme_classic() +
theme(axis.text.y = element_text(size = 16, face = «bold»)) +
theme(axis.title = element_text(size = 16, face = «bold»)) +
theme(legend.position=»none»)

и для придания финального лоска

tip: можно сохранить график в файл + ggsave(«allocations.svg»), но не стоит злоупотреблять векторным форматом, если на графике много точек — сохраняйте в растр, н-р png.

Отдельно стоит отметить цветовую палитру, используемую по-умолчанию: выбираемые цвета хорошо различимы даже для людей с ослабленым цветовосприятием.

Не используйте сочетание красный/зелёный даже если вы используете всего два цвета, чтобы выделить, что лучше/хуже — эти цвета слабо различимы для людей с ослабленым цветовосприятием.

Читайте также:  vkdj что это за программа как удалить

tip: colorbrewer2 поможет выбрать в т.ч. безопасные цвета.

Точки

Есть некоторое распределение адресов по нитям

отобразим отдельно по точкам + geom_point

ggplot(data=df, aes(x = address, y = index, group=thread, colour=thread, shape=thread)) +
geom_point(size=2)

Первое, что бросается в глаза (кроме того, что много данных) — это значения адресов в научной нотации. Как-то привычней иметь дело с адресами в 16-тиричной системе: добавим форматирование значений по оси X +scale_x_continuous():

Лучше, но всё равно как-то сложно и мало понятно.

Поскольку мы можем задавать любую функцию, то почему бы не отображать смещение относительно некоторого базового, н-р минимального, адреса:

Опять же в силу привычки — поставим метки (breaks =) по целым числам — а именно 16, 32, 48, 64Мб:

Данных много — хотим взглянуть на небольшую её часть

добавим метки в нужных местах на оси Y: + scale_y_continuous(breaks = c(. ))

df = read.csv(file = «csv/hashCodesNoTLAB.csv», nrows = 36, header = TRUE)

ggplot(data=df, aes(x = address, y = index, group=thread, colour=thread, shape=thread)) +
geom_point(size=4) +
scale_x_continuous(
labels = function(n),
breaks=c(min_address, min_address + 1610, min_address + 21610, min_address + 31610, min_address + 41610, min_address + 516*10)
) +
scale_y_continuous( breaks = c(1,2,3,4,5,6,7,8,9,10) ) +

Гистограмма

И конечно же — гистограмма, частотное распределение. Очень грубо это можно описать как количество элементов попадающих в диапазон значений. Н-р, для ряда [1, 2, 3, 1, 1] — гистограмма будет выглядеть как [3, 1, 1] — т.к элемент 1 встретился 3 раза, а элементы 2 и 3 по одному разу.

Добавляем уже известные опции до придания нужного вида:

Источник

Что такое грамматика графики ggplot2 (ч.1)

Начало. Продолжение в

Что такое ggplot2 и ggvis

ggplot2 – это расширение языка R, предназначенное для визуализации данных. Для создания графики ggplot2 использует систему абстрактных понятий: массив данных, визуальные средства, геометрические объекты, сопоставление переменных из массива визуальным средствам, статистическое преобразование переменных, системы координат и пр. Пакет ggplot2 является одним из самых популярных среди R-пользователей: в январе-мае 2013 года его скачали не менее 82 тысяч раз, что ставит его на третье место среди всех R-расширений (если учесть, что второе место занимает пакет digest, который используется для вычисления криптографических хеш-значений объектов в R, т.е. вряд ли он часто применяется пользователями напрямую, а гораздо чаще является зависимостью для других расширений, в т.ч. и для ggplot2, то ggplot2 переезжает на второе место). Функции ggplot2 берут на себя решение многих второстепенных вопросов (нужна ли легенда, где её разместить, какие границы выбрать для осей и пр.) и позволяют пользователю сконцентрироваться на самом важном. Для эффективного использования функционала ggplot2 пользователю необходимо понять принципы, заложенные в этом расширении.

Необходимо добавить несколько слов про ggvis: это совсем свежий R-пакет, реализующий идеи грамматики графики в интерактивном веб-ключе. Если ggplot2 вы будете использовать для создания статичных изображений, то ggvis предназначен для производства визуализаций аналогичного плана, но они будут интерактивными. В качестве бэкэнда визуализации ggvis использует vega, которая, в свою очередь, покоится на плечах D3.js, а для организации взаимодействия с пользователем ggvis использует R-расширение shiny.

Краткая предыстория создания ggplot2

ggplot2 начинался с того, что его будущий создатель Хэдли Викхэм прочитал книгу Лэланда Вилкинсона “The Grammar of Graphics“. Среди прочего Вилкинсон – это тот товарищ, который в статистическом пакете SPSS поменял предыдущую систему визуализации на новую, основанную на оригинальном языке программирования графики GPL (не путать с названием лицензионного договора GNU General Public License!).

И в 2005 году Викхэм создаёт своё первое расширение для R – он реализует идеи, представленные в книге Вилкинсона, в R-коде пакета ggplot. Это был его первый пакет для R, и, как позже говорит сам Хэдли, написан он был не самым лучшим образом (с точки зрения позднего Хэдли 🙂 ). Сегодня Хэдли – автор уже не одного десятка разных пакетов, включая лидера из упомянутого выше рейтинга. В 2007 году Хэдли выпустил радикально переделанный ggplot и, чтобы не ломать скрипты и пакеты, написанные другими пользователями под синтаксис первой версии, он меняет название на ggplot2. В 2009 году Хэдли публикует книгу ggplot2: Elegant Graphics for Data Analysis. В 2012 году выходит очередная версия пакета под номером 0.9, одно из значительных улучшений в которой – это переделанная внутренняя структура, которая упрощает сторонним пользователям процесс подключения к разработке ggplot2. В начале 2014 года в git-репозитории ggplot2 насчитывается 21 разработчик. Хэдли – молодец, он смог грамотно перевести ggplot2 из формата личного проекта на рельсы разработки открытым сообществом. А это, я подозреваю, не просто! Нужно было наступить на горло своей песне, сократить время, затрачиваемое на чистую разработку и добавление функций, а сконцентрироваться на такой “скучной ерунде”, как написание документации, комментирование кода и т.д.

Читайте также:  какие ходунки лучше на колесиках или без них

25 февраля 2014 года в почтовой группе, посвящённой ggplot2, Хэдли Викхэм официально объявил, что отныне работа над ggplot2 будет вестись в режиме поддержки: сами разработчики больше не будут добавлять в расширение новые функции, будут только вылавливать ошибки. Добавлением новых функций будут заниматься сами пользователи, которые могут дорабатывать ggplot2 и предлагать включать свои наработки в официальную версию. Соответственно, чтобы подчеркнуть переход ggplot2 на новый этап, версия расширения сменится на 1.0.0, а Хэдли ещё напишет популярным языком инструкцию о том, как сообщать об ошибках и предлагать свои наработки (чувствуете, опять работа с сообществом!).

Основы графической грамматики

В ggplot2 график является результатом взаимодействия ряда элементов:

Например, пользователь сообщает компьютеру, что хочет использовать массив данных про автомобили, переменная “скорость” будет выражена через положение по горизонтали, переменная “тормозной путь” через положение по вертикали, всё это нужно нарисовать с помощью геометрических объектов типа “точка”.

Вы спросите, а почему не заданы статистическое преобразование, координатная система, ориентиры и прочее. Все явно не указанные пользователем элементы графика берутся из значений по умолчанию. Например, если пользователь в качестве графического объекта указал тип “точки”, то по умолчанию статистических преобразований производиться не будет. А если он укажет тип “столбик”, то наблюдения в исходной переменной будут сгруппированы, а результатом применения статистики станет количество наблюдений в каждой группе.

На языке ggplot2 (да-да, я не оговорился: язык ggplot2 – это отдельный язык, а не R, но об этом позже) пример с точками будет выглядеть так:

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()


Аналогичный результат мы получим, если укажем не геометрию (geom_point), а соответствующую ей по умолчанию статистику (stat_identity).

ggplot(data = cars, aes(x = speed, y = dist)) + stat_identity()

Пример со столбиками:

ggplot(data = cars, aes(x = speed)) + geom_bar()


Умолчания распространяются и на другие элементы графика. Координатная система по умолчанию – декартова (coord_cartesian). Можем заменить на полярные координаты (coord_polar):

ggplot(data = cars, aes(x = speed)) + geom_bar() + coord_polar()


А что за дурацкий серый фон у графиков – часто звучит такой вопрос. Это тоже умолчание, но теперь уже в оформлении (theme_grey). Предполагается, что пользователь поместит график в публикацию, т.е. окружит его текстом. В обычной публикации цвет фона (бумаги) – белый, чернила – чёрные. “Средний” цвет страницы – серый. Если график сделать на белом фоне, то он будет резко выделяться на странице и вносить дисгармонию. А серый фон предназначен для уравновешивания цветового баланса страницы.

# Чёрно-белое оформление ggplot(data = cars, aes(x = speed, y = dist)) + stat_identity() + theme_bw()

Источник

Русские Блоги

оглавление

ggplot2

Полная графика ggplot2 включает:
ggplot(data,aes(. )) : Create a new ggplot (required)
geom_ (aes(. ),data,stat,position) : Geometric object (required)
or stat_ (aes(. ),data,geom,position) : Statistical transformation (required)
coord_ (. ) : Coordinate systems
facet_ (. ) : Facetting
scale_ (. ) : Scales
theme_ (. ) : Themes

aes() Контрольные данныепеременнаяКарта с геометрией. aes() Отображение может быть в ggplot() с участием geom Установить в слое. Общие параметры: альфа, цвет, группа, тип линии, размер

ggsave(filename, plot = last_plot(),path=NULL,width, height, units= c(«in», «cm», «mm»)) Сохраните графику ggplot2, последняя по умолчанию сохраняется

qplot(),quickplot() : Quick plot

Geoms

Используйте функцию geom, чтобы выразить график, параметр aes в geom отображает данные, а каждая функция geom добавляет слой.

continuous параметр Описание
geom_area() x, y, alpha, color, fill, linetype, size,stat= Диаграмма с областями
geom_density(kernel = “gaussian”) x, y, alpha, color, fill, group, linetype, size, weight, adjust=1/2 (Отрегулируйте коэффициент пропускной способности), stat = (density, count, scaled (оценка плотности)) Карта ядерной плотности
geom_dotplot() x, y, alpha, color, fill Пунктирная карта
geom_freqpoly() x, y, alpha, color, group, linetype, size Полигон частот (похож на гистограмму)
geom_histogram(binwidth) x, y, alpha, color, fill, linetype, size, weight Гистограмма
geom_qq(aes(sample)) x, y, alpha, color, fill, linetype, size, weight график qq (обнаружение нормального распределения)
discrete
geom_bar() x, альфа, цвет, заливка, тип линии, размер, вес, stat = Гистограмма

3. Двумерный

geom_smooth(method = «auto», formula = y

x)
Параметры:
method: eg. “lm”, “glm”, “gam”, “loess”, “rlm”
formula :eg. y

log(x)
se: рисовать ли доверительный интервал (по умолчанию TRUE)
level: используемый уровень доверительного интервала (по умолчанию 95%).

График функции двух непрерывных переменных параметр Описание
geom_area() x, y, alpha, color, fill, linetype, size Диаграмма с областями
geom_line() x, y, alpha, color, group, linetype, size линейный график
geom_step(direction = “hv”) x, y, alpha, color, group, linetype, size Лестничная диаграмма

4. Три переменных

5. Текст

функция параметр Описание
geom_text(aes(label), nudge_x, nudge_y, check_overlap = TRUE) x, y, label, alpha, angle, color, family, fontface, hjust, lineheight, size, vjust
geom_label(aes(label), nudge_x, nudge_y, check_overlap = TRUE) x, y, label, alpha, angle, color, family, fontface, hjust, lineheight, size, vjust Фоновая рамка

Параметры:
nudge_x, nudge_y: точная настройка
check_overlap: нужно ли перекрывать
vjust, hjust: alignment (0: 1)
угол: угол
lineheight: межстрочный интервал
семейство: шрифт
size: размер шрифта
fontface: формат шрифта (1: 4, обычный стандартный, полужирный полужирный, курсивный курсив, полужирный. начальный)

Пакет ggrepel: текст не перекрывается
ggrepel:: geom_label_repel()
ggrepel:: geom_text_repel()

6. Визуализация ошибок

функция параметр Описание
geom_crossbar(fatten) x, y, ymax, ymin, alpha, color, fill, group, linetype, size
geom_errorbar() x, ymax, ymin, alpha, color, group, linetype, size, width (also geom_errorbarh())
geom_linerange() x, ymin, ymax, alpha, color, group, linetype, size
geom_pointrange() x, y, ymin, ymax, alpha, color, fill, group, linetype, shape, size

aes(ymin,ymax) : ymin, ymax необходимо указать в параметре aes

7. Карта

функция параметр Описание
geom_map(aes(map_id), map) map_id, alpha, color, fill, linetype, size карта

Параметры:
map_id:id/region
map: data.frame (x / long, y / lat, id / region) или sp пространственные данные
Tips:
sf::st_read Прочтите файл sp или json
sf::st_transform Конвертируйте файл sf
Материал карты:
Ссылка на материал векторной карты
Карта данных shp: GitHub, GADM
Карта данных Json: Alibaba Cloud, Baidu Echarts

Stats

ggplot2 также предоставляет альтернативу для создания слоя с stat Рассчитайте новые переменные (например, count, prop) для построения графиков.

Источник

IdentityServer4. Основные понятия. OpenID Connect, OAuth 2.0 и JWT

Этим постом я хочу открыть ветку статей посвященную IdentityServer4. Начнем мы с основных понятий.

Самым перспективным на текущий момент протоколом аутентификации является OpenID Connect, а протоколом авторизации (предоставления доступа) является OAuth 2.0. IdentityServer4 реализует эти два протокола. Он оптимизирован для решения типичных проблем безопасности.

OpenID Connect — это протокол и стандарт аутентификации, он не дает доступ к ресурсам (Web API), но т.к. он разработан поверх протокола авторизации OAuth 2.0, он позволяет получить параметры профиля пользователя как будто вы получили доступ к ресурсу UserInfo.

JWT (JSON Web Token) представляет собой веб-стандарт, который определяет способ передачи данных о пользователе в формате JSON в зашифрованном виде.

OAuth 2.0 (RFC 6749) — это протокол и стандарт авторизации. Он позволяет приложениям получить доступ к защищенным ресурсам, например к Web API.

Взглянем на диаграмму обращения к защищенному ресурсу и разберемся с основными шагами и принятой терминологией:

Клиент запрашивает у пользователя разрешение пройти авторизацию от его имени. Клиент — это клиентское приложение обращающиеся к защищённым ресурсам от имени владельца ресурсов. Ресурс — это все наши защищенные сервисы Web API.

User разрешает клиентскому приложению пройти авторизацию от его имени, например, вводит логин и пароль. Логин и пароль будут являться грантом авторизации для клиентского приложения. User (владелец ресурса) — программа или человек, который может выдать доступ к защищённым ресурсам, например, путем ввода логина (username) и пароля (password);

Если подлинность приложения подтверждена и разрешение на авторизацию действительно, IdentiryServer4 создаёт access-токен (токен доступа) для приложения и необязательный ключ обновления ( refresh-токен ). Процесс авторизации завершён. Если запрос недопустимый или несанкционированный, то сервер авторизации возвращает код с соответствующим сообщением об ошибке.

Клентское приложение обращается за данными к защищенному Web API, предоставляя при этом токен доступа для авторизации. Если код ответа сервера ресурсов 401, 403 или 498, то токен доступа, используемый для аутентификации, недействителен или просрочен.

Если токен действителен, Web API предоставляет данные приложению.

Типы токенов

Введем еще два понятия:

Authenticatation Server Url — конечная точка для получения ключа доступа. Все запросы на предоставление и возобновление ключей доступа будем направлять на этот URL-адрес.

Resource Url — URL-адрес защищенного ресурса, по которому нужно обращаться, чтобы получить доступ к нему, передавая ему ключ доступа в заголовке авторизации.

Запрос ключа доступа

Для запроса ключа доступа клиент делает POST запрос к конечной точке IdentityServer4 со следующим заголовком

и передавая следующие параметры:

Протокол OAuth 2.0 определяет следующие типы грантов требующие обязательного взаимодействие с пользователям:

И типы грантов, которые могут выполняться без интерактивного взаимодействия с пользователям:

scope — это необязательный параметр. Он определяет область видимости. Токен доступа, возвращенный сервером, будет обеспечивать доступ только к тем службам, которые входят в эту область. Т.е. мы можем несколько служб объединить под одним scope и если клиент получает ключ доступа к этому scope он получает доступ ко всем этим службам. Также scope может использоваться для ограничения прав авторизации (например, доступ на чтение или запись)

Источник

Читайте также:  биостимулятор милева что это
Информ портал о технике и не только