<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Weekly Charts</title><subtitle>Weekly Charts</subtitle><author><name>Weekly Charts</name></author><id>https://teletype.in/atom/weekly_charts</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/weekly_charts?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@weekly_charts?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=weekly_charts"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/weekly_charts?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-08T04:15:12.760Z</updated><entry><id>weekly_charts:NQBfaBt0zwL</id><link rel="alternate" type="text/html" href="https://teletype.in/@weekly_charts/NQBfaBt0zwL?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=weekly_charts"></link><title>Визуализируем данные мониторинга температуры процессора Rapsberry PI Zero W</title><published>2022-09-21T00:52:43.260Z</published><updated>2022-09-21T19:29:22.141Z</updated><tt:hashtag>week02</tt:hashtag><tt:hashtag>температура</tt:hashtag><tt:hashtag>raspberry_pi</tt:hashtag><tt:hashtag>step_line_chart</tt:hashtag><tt:hashtag>r</tt:hashtag><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a9/70/a970117a-d1c8-4b9d-a9a2-bf1a9440c00f.jpeg&quot;&gt;Прошлый пост был посвящен автоматическому скачиванию и подготовке  данных о погоде в регионах России для создания интерактивной плиточной карты РФ. Для автоматического обновления данных используется скрипт на языке R, который выполняется по расписанию (ежедневно каждые три часа) на моем маленьком домашнем устройстве — Raspberry PI Zero W. </summary><content type="html">
  &lt;tt-tags id=&quot;ocQV&quot;&gt;
    &lt;tt-tag name=&quot;week02&quot;&gt;#week02&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;температура&quot;&gt;#температура&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;raspberry_pi&quot;&gt;#raspberry_pi&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;step_line_chart&quot;&gt;#step_line_chart&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;r&quot;&gt;#r&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;
  &lt;p id=&quot;oiHH&quot;&gt;Прошлый пост был посвящен &lt;a href=&quot;https://teletype.in/@weekly_charts/editor/YodM2Y8SNmM&quot; target=&quot;_blank&quot;&gt;автоматическому скачиванию и подготовке  данных о погоде&lt;/a&gt; в регионах России для создания интерактивной &lt;a href=&quot;https://www.datawrapper.de/_/Lugge/&quot; target=&quot;_blank&quot;&gt;плиточной карты&lt;/a&gt; РФ. Для автоматического обновления данных используется скрипт на языке R, который выполняется по расписанию (ежедневно каждые три часа) на моем маленьком домашнем устройстве — &lt;a href=&quot;https://ru.wikipedia.org/wiki/Raspberry_Pi&quot; target=&quot;_blank&quot;&gt;Raspberry PI Zero W&lt;/a&gt;. &lt;/p&gt;
  &lt;figure id=&quot;fSuk&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a9/70/a970117a-d1c8-4b9d-a9a2-bf1a9440c00f.jpeg&quot; width=&quot;960&quot; /&gt;
    &lt;figcaption&gt;Маленький домашний помощник, работающий в режиме 24/7&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6jti&quot;&gt;&lt;strong&gt;Исходные данные: &lt;/strong&gt;&lt;a href=&quot;https://disk.yandex.ru/d/b6Qu6RSAUGXqLg&quot; target=&quot;_blank&quot;&gt;cpu_temp.log&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Wlil&quot;&gt;В этот раз мы будем визуализировать данные поминутного изменения температуры процессора Raspberry PI, которые сохраняются в специальным лог-файле c помощью &lt;a href=&quot;https://habr.com/ru/company/ruvds/blog/325522/&quot; target=&quot;_blank&quot;&gt;bash-скрипта&lt;/a&gt;:&lt;/p&gt;
  &lt;pre id=&quot;QRyj&quot; data-lang=&quot;bash&quot;&gt;#!/bin/bash
date +&amp;quot;%d.%m.%Y %T&amp;quot; | tr &amp;#x27;\n&amp;#x27; &amp;#x27;\t&amp;#x27; &amp;gt;&amp;gt; /home/pi/cpu_temp.log ; vcgencmd measure_temp| tr -d &amp;quot;temp=&amp;quot; | tr -d &amp;quot;&amp;#x27;C&amp;quot; &amp;gt;&amp;gt; /home/pi/cpu_temp.log&lt;/pre&gt;
  &lt;p id=&quot;DnLt&quot;&gt;Для запуска bash-скрипта по расписанию через cron была добавлена запись (каждую минуту):&lt;/p&gt;
  &lt;p id=&quot;fugC&quot;&gt;*/1 * * * * ~/cpu_temp.sh&lt;br /&gt;&lt;br /&gt;В результате выполнения скрипта данные о температуре процессора сохраняются в лог:&lt;/p&gt;
  &lt;figure id=&quot;b4py&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c9/6f/c96fa507-8055-46ee-8d19-72e9af29eff4.png&quot; width=&quot;1065&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VbpY&quot;&gt;Эти данные мы и будем визуализировать с помощью R (&lt;a href=&quot;https://disk.yandex.ru/d/NgkCtteoZ-fPag&quot; target=&quot;_blank&quot;&gt;cpu_temp.R&lt;/a&gt;), лого для вставки на график:  &lt;a href=&quot;https://disk.yandex.ru/d/dP16Vwq9sH6RNQ&quot; target=&quot;_blank&quot;&gt;https://disk.yandex.ru/d/dP16Vwq9sH6RNQ&lt;/a&gt;&lt;/p&gt;
  &lt;pre id=&quot;zqMt&quot; data-lang=&quot;r&quot;&gt;library(tidyverse)
library(readr)
library(geomtextpath)
library(glue)
library(here)
# Загружаем логотип Raspberry Pi
# лого: https://disk.yandex.ru/d/dP16Vwq9sH6RNQ
png &amp;lt;- magick::image_read(&amp;quot;raspberrypi-logo.png&amp;quot;)
img &amp;lt;- grid::rasterGrob(png, interpolate = TRUE)
# Загружаем данные (лог температуры)
cpu_temp &amp;lt;- read_delim(
    &amp;quot;cpu_temp.log&amp;quot;,
    delim = &amp;quot;\t&amp;quot;,
    col_names = c(&amp;quot;datetime&amp;quot;, &amp;quot;cpu_temp&amp;quot;),
    trim_ws = TRUE) %&amp;gt;%
  mutate(datetime = lubridate::as_datetime(datetime,
                                           &amp;quot;%d.%m.%Y %H:%M:%S&amp;quot;,
                                           tz = &amp;quot;Asia/Yekaterinburg&amp;quot;))
# Временной интервал для графика -- последние 3 часа из лога
last_datetime &amp;lt;- cpu_temp$datetime[length(cpu_temp$datetime)]
first_datetime &amp;lt;- last_datetime - lubridate::hours(3)
# Описательные для графика (мин, макс, среднее)
maxTempCPU &amp;lt;- max(cpu_temp$cpu_temp[between(cpu_temp$datetime,
                                            first_datetime, last_datetime)])
minTempCPU &amp;lt;- min(cpu_temp$cpu_temp[between(cpu_temp$datetime,
                                            first_datetime, last_datetime)])
meanTempCPU_period &amp;lt;-
  round(mean(cpu_temp$cpu_temp[between(cpu_temp$datetime,
                                       first_datetime, last_datetime)]), 1)
# для вставки лого
# mt &amp;lt;- ceiling(max(cpu_temp$cpu_temp[between(cpu_temp$datetime,
                                            # first_datetime, last_datetime)]))
mt &amp;lt;- ceiling(max(cpu_temp$cpu_temp))
mt_min &amp;lt;- floor(min(cpu_temp$cpu_temp))
x_max &amp;lt;- last_datetime + lubridate::minutes(25)
x_min &amp;lt;- last_datetime + lubridate::minutes(10)

cpu_temp %&amp;gt;%
  filter(between(datetime, first_datetime, last_datetime)) %&amp;gt;%
  ggplot(aes(datetime, cpu_temp)) +
  annotation_custom(
    img,
    ymin = mt ,
    ymax = mt + 8.25,
    xmin = x_min,
    xmax = x_max
  ) +
  geom_texthline(
    yintercept = mean(cpu_temp$cpu_temp),
    size = 3.75,
    linetype = &amp;quot;dashed&amp;quot;,
    linewidth = 0.25,
    label = glue(&amp;quot;Среднее за всё время: &amp;lt;b&amp;gt;{round(mean(cpu_temp$cpu_temp),1)}&amp;lt;/b&amp;gt;°C&amp;quot;),
    hjust = 0.985,
    vjust = -0.2,
    color = &amp;quot;gray70&amp;quot;,
    rich = TRUE
  ) +
  geom_texthline(
    yintercept = meanTempCPU_period,
    size = 3.75,
    linewidth = 0.25,
    label = glue(&amp;quot;Среднее за 3 часа: &amp;lt;b&amp;gt;{meanTempCPU_period}&amp;lt;/b&amp;gt;°C&amp;quot;),
    hjust = 0.985,
    vjust = -0.2,
    color = &amp;quot;gray70&amp;quot;,
    rich = TRUE
  ) +
  geom_step(color = &amp;quot;gray10&amp;quot;) +
  scale_y_continuous(
    breaks = seq(mt_min, mt + 1, 2),
    limits = c(mt_min, mt + 1),
    labels = c(as.character(seq(mt_min, mt - 1, 2)),
               glue::glue(&amp;quot;{mt + 1}°C&amp;quot;))
  ) +
  scale_x_datetime(
    &amp;quot;Время&amp;quot;,
    date_breaks = &amp;quot;30 min&amp;quot;,
    date_labels = &amp;quot;%H:%M&amp;quot;,
    expand = c(0.15, 0)
  ) +
  labs(
    title = &amp;quot;Температура процессора Raspberry Pi Zero W&amp;quot;,
    subtitle = glue(
      &amp;quot;Поминутное изменение температуры за последние 3 часа\n&amp;quot;,
      &amp;quot;{format(first_datetime, format = &amp;#x27;%d %b %H:%M&amp;#x27;)} - {format(last_datetime, format = &amp;#x27;%H:%M&amp;#x27;)}&amp;quot;,
      &amp;quot; | Мин {minTempCPU}°C | Среднее {meanTempCPU_period}°C | Макс {maxTempCPU}°C&amp;quot;
    ),
    x = &amp;quot;Время&amp;quot;,
    y = &amp;quot;&amp;quot;
  ) +
  coord_cartesian(clip = &amp;quot;off&amp;quot;) +
  theme(text = element_text(family = &amp;quot;Open Sans&amp;quot;),
        panel.background = element_blank(),
        axis.title.x = element_text(size = 14),
        plot.margin = margin(25, 30, 10, 12),
        plot.title.position = &amp;quot;plot&amp;quot;,
        plot.subtitle = element_text(size = 12, color = &amp;quot;gray60&amp;quot;),
        title = element_text(size = 16),
        axis.text.y = element_text(size = 12),
        axis.text.x = element_text(size = 12)
  )
ggsave(
  glue(&amp;quot;img/cpu_temp_{format(last_datetime, &amp;#x27;%d_%m_%Y_%H_%M&amp;#x27;)}.png&amp;quot;),
  dpi = 300,
  scale = 1.5
)&lt;/pre&gt;
  &lt;figure id=&quot;9ZT5&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5e/a2/5ea28891-a00e-4211-a5c2-80b2c849d716.png&quot; width=&quot;928&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XEXt&quot;&gt;Для запуска скрипта каждые три часа создадим задачу в cron:&lt;/p&gt;
  &lt;p id=&quot;SWy9&quot;&gt;0 */3 * * * Rscript /home/pi/cpu_temp/cpu_temp_pi.R&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;Ncvy&quot;&gt;Полученный график будем отправлять себе в телеграм через телеграм-бота, созданного специально для отправки личных уведомлений простой командой в конце нашего скрипта:&lt;/p&gt;
  &lt;pre id=&quot;Q47c&quot; data-lang=&quot;r&quot;&gt;bot$sendPhoto(chat_id,
              photo = glue(&amp;quot;~/cpu_temp/img/cpu_temp_{format(last_datetime, &amp;#x27;%d_%m_%Y_%H_%M&amp;#x27;)}.png&amp;quot;)
)&lt;/pre&gt;
  &lt;figure id=&quot;Xgdc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/24/9224f1fb-06b1-41ca-b1b7-484c6d309e63.jpeg&quot; width=&quot;720&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4NW4&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;SIDF&quot;&gt;&lt;strong&gt;Мой телеграм-канал: &lt;a href=&quot;https://t.me/weekly_charts&quot; target=&quot;_blank&quot;&gt;https://t.me/weekly_charts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</content></entry><entry><id>weekly_charts:YodM2Y8SNmM</id><link rel="alternate" type="text/html" href="https://teletype.in/@weekly_charts/YodM2Y8SNmM?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=weekly_charts"></link><title>Погода в регионах России</title><published>2022-09-13T20:59:01.407Z</published><updated>2022-09-21T01:08:42.239Z</updated><tt:hashtag>r</tt:hashtag><tt:hashtag>datawrapper</tt:hashtag><tt:hashtag>weather</tt:hashtag><tt:hashtag>плиточные_карты</tt:hashtag><tt:hashtag>api</tt:hashtag><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9f/32/9f320603-b9a1-46a3-a42e-03335a4b9345.png&quot;&gt;В русскоязычном датавиз-чате спросили:</summary><content type="html">
  &lt;tt-tags id=&quot;6vbZ&quot;&gt;
    &lt;tt-tag name=&quot;r&quot;&gt;#r&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;datawrapper&quot;&gt;#datawrapper&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;weather&quot;&gt;#weather&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;плиточные_карты&quot;&gt;#плиточные_карты&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;api&quot;&gt;#api&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;
  &lt;p id=&quot;gU5t&quot;&gt;В русскоязычном датавиз-чате спросили:&lt;/p&gt;
  &lt;figure id=&quot;xG9z&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9f/32/9f320603-b9a1-46a3-a42e-03335a4b9345.png&quot; width=&quot;579&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;eNta&quot;&gt;Почему бы не попробовать сделать подобное для России?&lt;/p&gt;
  &lt;h3 id=&quot;7N5U&quot;&gt;&lt;strong&gt;Исходные данные&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;F2iC&quot;&gt;Я вспомнил, что как-то давно для Екатеринбурга уже получал данные о погоде в R с помощью &lt;a href=&quot;https://openweathermap.org/api&quot; target=&quot;_blank&quot;&gt;API от OpenWeather &lt;/a&gt;и пакета &lt;a href=&quot;https://github.com/crazycapivara/owmr&quot; target=&quot;_blank&quot;&gt;owmr&lt;/a&gt;. Можно попробовать с помощью R скачать данные о погоде для всех &lt;a href=&quot;https://ru.wikipedia.org/wiki/Административные_центры_субъектов_Российской_Федерации&quot; target=&quot;_blank&quot;&gt;административных центров субъектов РФ&lt;/a&gt;, а визуализацию сделать в виде интерактивной &lt;a href=&quot;https://gizh.ru/all/russian-tilemap/&quot; target=&quot;_blank&quot;&gt;плиточной карты&lt;/a&gt; в Datawrapper.&lt;/p&gt;
  &lt;h3 id=&quot;tDOH&quot;&gt;&lt;strong&gt;Краткое описание процесса получения и предобработки данных в R&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;xU8v&quot;&gt;&lt;em&gt;Если вы не знаете R, можете пропустить эту часть, сохранив себе ссылку на гугл-таблицу из 5 шага.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;TA91&quot;&gt;&lt;strong&gt;Шаг 1)&lt;/strong&gt; Из Википедии скачиваем список регионов и список административных центров регионов:&lt;/p&gt;
  &lt;pre id=&quot;VIen&quot; data-lang=&quot;r&quot;&gt;library(tidyverse)
library(rvest)

url &amp;lt;- &amp;quot;https://ru.wikipedia.org/wiki/Административные_центры_субъектов_Российской_Федерации&amp;quot;

regions &amp;lt;- read_html(url) %&amp;gt;%
  html_element(&amp;quot;table&amp;quot;) %&amp;gt;%
  html_table() %&amp;gt;%
  filter(!is.na(&amp;#x60;Код ОКАТО&amp;#x60;)) %&amp;gt;%
  mutate(&amp;#x60;Субъект Российской Федерации&amp;#x60; = gsub(&amp;quot;\\[1\\]&amp;quot;, &amp;quot;&amp;quot;, 
                                               &amp;#x60;Субъект Российской Федерации&amp;#x60;)) %&amp;gt;%
  select(&amp;#x60;Субъект Российской Федерации&amp;#x60;, &amp;#x60;Административный центр&amp;#x60;) %&amp;gt;% 
  rename(&amp;quot;region&amp;quot; = &amp;quot;Субъект Российской Федерации&amp;quot;, 
             &amp;quot;city&amp;quot; = &amp;quot;Административный центр&amp;quot;)
           &lt;/pre&gt;
  &lt;p id=&quot;SXFt&quot;&gt;Итак, таблица со списком регионов и их админ-центрами выглядит так:&lt;/p&gt;
  &lt;figure id=&quot;nJp6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0f/d0/0fd057ef-4c1d-418a-84c1-726a7d5011ec.png&quot; width=&quot;605&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sEi4&quot;&gt;&lt;strong&gt;Файл:&lt;/strong&gt; Административные центры субъектов РФ &lt;a href=&quot;https://disk.yandex.ru/d/gMylbj2sIfDbXA&quot; target=&quot;_blank&quot;&gt;regions.csv&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;mXar&quot;&gt;&lt;strong&gt;Шаг 2)&lt;/strong&gt; Для получения данных о погоде через API командой find_city() пакета qwmr нам необходимо получить ID городов, сохранив в виде csv-таблицы:&lt;/p&gt;
  &lt;figure id=&quot;DsLA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f7/bd/f7bd0894-a3f7-4f48-b025-ec4b6fbc419b.png&quot; width=&quot;1081&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JepH&quot;&gt;&lt;strong&gt;Файл: &lt;/strong&gt;ID городов &lt;a href=&quot;https://disk.yandex.ru/d/CJdpQPfeAESgLw&quot; target=&quot;_blank&quot;&gt;city_admin.csv&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;4tq5&quot;&gt;&lt;strong&gt;Шаг 3) &lt;/strong&gt;Также нам пригодится два файла: эмодзи-символы погоды и их соответствие кодам иконок сервиса и таблица-ключ с названиями регионов для последующего объединения датасетов (данных о погоде и названий регионов), в котором присутствует наименование регионов и метки (аббревиатуры) регионов, чтобы их распознал Datawrapper.&lt;/p&gt;
  &lt;p id=&quot;cnOr&quot;&gt;&lt;strong&gt;Файл:&lt;/strong&gt; иконки и символы погоды &lt;a href=&quot;https://disk.yandex.ru/d/maSoDY-LhgvVvA&quot; target=&quot;_blank&quot;&gt;weather_icons.csv&lt;/a&gt; &lt;/p&gt;
  &lt;p id=&quot;NKYT&quot;&gt;&lt;strong&gt;Файл:&lt;/strong&gt; таблица-ключ регионов &lt;a href=&quot;https://disk.yandex.ru/d/h2gjH6zZ7DcYfw&quot; target=&quot;_blank&quot;&gt;regions_key.csv&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;f0jI&quot;&gt;&lt;strong&gt;Шаг 4)&lt;/strong&gt; Получаем данные о погоде по 85 городам c помощью предварительно написанной функции:&lt;/p&gt;
  &lt;pre id=&quot;Jv9i&quot; data-lang=&quot;r&quot;&gt;# Текущая погода по административным центрам
get_city_weather &amp;lt;- function(city) {
  res &amp;lt;- get_current(city, units = &amp;quot;metric&amp;quot;, lang = &amp;quot;RU&amp;quot;) %&amp;gt;%
    owmr_as_tibble() %&amp;gt;%
    mutate(name = city) %&amp;gt;%
    select(name, dt_txt, temp, temp_min, 
           temp_max, weather_id, 
           weather_main, weather_description, weather_icon) %&amp;gt;%
    mutate(icon_url = get_icon_url(weather_icon))
  Sys.sleep(2) # пауза в 2 секунды, чтобы не выйти за лимиты API 
  return(res)
}

df &amp;lt;- pro_map_df(city$name, get_city_weather)
&lt;/pre&gt;
  &lt;p id=&quot;PsYv&quot;&gt;&lt;strong&gt;Шаг 5)&lt;/strong&gt; Объединяем данные, делаем небольшие преобразования и загружаем итоговый датасет в гугл-таблицы:&lt;/p&gt;
  &lt;pre id=&quot;xvnJ&quot; data-lang=&quot;r&quot;&gt;city &amp;lt;- left_join(city, df, by = c(&amp;quot;city_eng&amp;quot; = &amp;quot;name&amp;quot;)) 
city &amp;lt;- left_join(city, weather_icons, by = c(&amp;quot;weather_icon&amp;quot; = &amp;quot;icon_weather&amp;quot;))
city &amp;lt;- left_join(city, regions_key, by = c(&amp;quot;region&amp;quot;, &amp;quot;city&amp;quot;))
city$temp &amp;lt;- round(city$temp) #округляем значения температуры до целых
# создаем метку аббревиатура города, температура и эмодзи-символ погоды
city$labels &amp;lt;- glue::glue(&amp;quot;{city$RNabbr}&amp;lt;br&amp;gt;{city$temp}°C {city$utf_code}&amp;quot;)

# Сохраняем локально в csv данные о погоде на конкретную дату и время запроса
write_csv2(city, glue(&amp;quot;data/city_{format(Sys.time(), &amp;#x27;%d_%m_%Y_%H_%M&amp;#x27;)}.csv&amp;quot;))
# Обновляем гугл-таблицу
write_sheet(city, ss = &amp;quot;ID_гугл-таблицы&amp;quot;, sheet = &amp;quot;city&amp;quot;)
&lt;/pre&gt;
  &lt;p id=&quot;lOD0&quot;&gt;&lt;strong&gt;Обновляемая гугл-таблица с данными о погоде, которую используем как источник данных для Datawrapper:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;6S0e&quot;&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1wDqElULkz4Eycz03q8CmtFTi0oRO4kYan_MEkkRZABU/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;https://docs.google.com/spreadsheets/d/1wDqElULkz4Eycz03q8CmtFTi0oRO4kYan_MEkkRZABU/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;xRAg&quot;&gt;&lt;strong&gt;Полный R-скрипт:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;fx6W&quot; data-lang=&quot;r&quot;&gt;library(tidyverse)
library(owmr)
library(purrrgress)
library(glue)
library(googlesheets4)
library(here)

# проходим авторизацию через сервисный аккаунт Google Cloud
# см. инструкцию https://habr.com/ru/post/488756/
# API-key OpenWeatherMap

gs4_auth(path = &amp;quot;_ваши_данные_.json&amp;quot;)
owmr_settings(&amp;quot;_ваш_API_key_&amp;quot;)

# Загрузка данных
weather_icons &amp;lt;- read_csv(&amp;quot;weather_icons.csv&amp;quot;)
regions &amp;lt;- read_csv2(&amp;quot;regions.csv&amp;quot;)
regions_key &amp;lt;- read_csv(&amp;quot;regions_keys.csv&amp;quot;)
city &amp;lt;- read_csv(&amp;quot;city_admin.csv&amp;quot;)

# Текущая погода по административным центрам
get_city_weather &amp;lt;- function(city) {
  res &amp;lt;- get_current(city, units = &amp;quot;metric&amp;quot;, lang = &amp;quot;RU&amp;quot;) %&amp;gt;%
    owmr_as_tibble() %&amp;gt;%
    mutate(name = city) %&amp;gt;%
    select(name, dt_txt, temp, temp_min, 
           temp_max, weather_id, 
           weather_main, weather_description, weather_icon) %&amp;gt;%
    mutate(icon_url = get_icon_url(weather_icon))
  Sys.sleep(2) # пауза, чтобы не выйти за лимиты запросов API
  return(res)
}

df &amp;lt;- pro_map_df(city$city_eng, get_city_weather)

city &amp;lt;- left_join(city, df, by = c(&amp;quot;city_eng&amp;quot; = &amp;quot;name&amp;quot;)) 
city &amp;lt;- left_join(city, weather_icons, by = c(&amp;quot;weather_icon&amp;quot; = &amp;quot;icon_weather&amp;quot;))
city &amp;lt;- left_join(city, regions_key, by = c(&amp;quot;region&amp;quot;, &amp;quot;city&amp;quot;))
city$temp &amp;lt;- round(city$temp)
city$labels &amp;lt;- glue::glue(&amp;quot;{city$RNabbr}&amp;lt;br&amp;gt;{city$temp}°C {city$utf_code}&amp;quot;)

# Сохраняем локально в csv данные о погоде на конкретную дату и время запроса
write_csv2(city, glue(&amp;quot;data/city_{format(Sys.time(), &amp;#x27;%d_%m_%Y_%H_%M&amp;#x27;)}.csv&amp;quot;))
# Обновляем гугл-таблицу
write_sheet(city, ss = &amp;quot;ID гугл-таблицы&amp;quot;, sheet = &amp;quot;city&amp;quot;)&lt;/pre&gt;
  &lt;h3 id=&quot;jAam&quot;&gt;Создаем плиточную карту РФ в Datawrapper&lt;/h3&gt;
  &lt;p id=&quot;R9xa&quot;&gt;Шаг 1) Открываем &lt;a href=&quot;https://app.datawrapper.de/&quot; target=&quot;_blank&quot;&gt;Datawrapper&lt;/a&gt;, в меню выбираем создать новую карту (Create Map) и выбираем тип карты &amp;quot;Choropleth map&amp;quot;, через поиск находим плиточный вариант карты для России (Russia &amp;gt;&amp;gt; Regions (squares)):&lt;/p&gt;
  &lt;figure id=&quot;tHR1&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e8/2a/e82a81a6-6560-4247-9bb1-e5d8fecac03a.png&quot; width=&quot;1159&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EP3u&quot;&gt;Шаг 2) Указываем, что наши данные в виде ссылки на внешний источник данных Link external dataset&lt;/p&gt;
  &lt;figure id=&quot;xhfE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6e/a0/6ea0f6b1-cbb0-4714-86a0-3c5bee3c3c01.png&quot; width=&quot;639&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MrM0&quot;&gt;Вставляем ссылку на гугл-таблицу (см. 5 шаг выше). Если все ОК, то напротив будет зеленая галочка. Выбираем пункт Use Datawrapper server и нажимаем кнопку Connect:&lt;/p&gt;
  &lt;figure id=&quot;xtd0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/77/65779c7e-d8cf-447a-83a2-d37189d00090.png&quot; width=&quot;492&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UNjS&quot;&gt;Убеждаемся, что данные успешно загрузились:&lt;/p&gt;
  &lt;figure id=&quot;EdnF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e9/a0/e9a0a68a-27f4-4bad-be3a-65afd361d0da.png&quot; width=&quot;1711&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9y5j&quot;&gt;Шаг 3) Настраиваем нашу визуализацию (плиточную карту). Выбираем столбец (переменную, которая будет кодировать цвет плиток) — temp (1), выбираем палитру (2), тип палитры (3), а также указываем дополнительные атрибуты палитры (4) — количество интервалов, максимальное и минимальные значения:&lt;/p&gt;
  &lt;figure id=&quot;KmmZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4e/d6/4ed6481b-ecf7-4815-8376-7b7a524726b4.png&quot; width=&quot;1325&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ae4q&quot;&gt;Важно изменить направление цветов палитры, чтобы положительным значениям температуры соответствовали оттенки красного, а отрицательным — синего: нажмите на ключ, затем на кнопку Reverse:&lt;/p&gt;
  &lt;figure id=&quot;5znp&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b5/9b/b59b7671-e89c-43be-9fd8-5f588d541a5a.png&quot; width=&quot;1125&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TbFW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;dsoC&quot;&gt;На вкладке Annotate напишите заголовок визуализации, а также задайте метки для плиточек регионов. Для этого активируйте переключатель Show labels, выберите столбец (переменную) labels, в котором у нас хранятся метки регионов, температура и эмодзи-символ погоды.&lt;/p&gt;
  &lt;figure id=&quot;kacm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/cc/7acce474-38c3-4704-abbd-72693e1ec2bc.png&quot; width=&quot;1192&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TyFU&quot;&gt;Попробуйте далее самостоятельно дооформить визуализацию: добавить описание, автора, источник данных, ссылку на источник данных, определить возможные размеры плиточной карты и т.п. После этого переходите к шагу публикации визуализации -- получения ссылки на нее (вкладка Publish&amp;amp;Embed). &lt;/p&gt;
  &lt;p id=&quot;8rDx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;hSFA&quot;&gt;&lt;strong&gt;Финальный вариант плиточной карты эмодзи-погоды в России:&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;0qji&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe src=&quot;https://datawrapper.dwcdn.net/Lugge/9/&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UHTd&quot;&gt;&lt;strong&gt;Мой телеграм-канал: &lt;a href=&quot;https://t.me/weekly_charts&quot; target=&quot;_blank&quot;&gt;https://t.me/weekly_charts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</content></entry></feed>