TGViewer
Серый Конрад! Серый Конрад! @graymanfm · 62 subscribers
Post #261 65
Obsidian. Графики

Болезнь не повод забить на улучшение своей инфраструктуры.

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

Благо разные умельцы уже сделали хорошие плагины. В частности я использовал плагин Charts. Повозился с ним часок, чтобы привести графики в должный вид и получить ровно тот набор данных, который мне нужен.

На выходе получился код, который подтягивает значения, которые я проставляю в Daily файлах, суммиризирует их по мессяцам и выдает вот такую статистику.

Можно сделать и по неделям, но так слишком большие флуктуации и не дает никакой дополнительной информации

```dataviewjs
const pages = dv.pages("#daily")
.where(p => p.file.day?.year === 2025)
.array(); // превращаем в массив для удобства

const groups = {};
for (let p of pages) {
// Получаем текст ссылки или "Без месяца" если нет
const monthLabel = p.month ? (p.month.display ?? p.month.path ?? String(p.month)) : "Без месяца";
if (!groups[monthLabel]) groups[monthLabel] = [];
groups[monthLabel].push(p);
}


// 2. Создаём массивы для графика
let labels = [];
let capitalData = [];
let healthData = [];
let influenceData = [];
let happyData = [];
let processData = [];

Object.entries(groups)
.sort((a, b) => String(a[0]).localeCompare(String(b[0]), 'ru', { numeric: true })) // сортируем недели
.forEach(([monthLabel, items]) => {
labels.push(monthLabel);

capitalData.push(items.reduce((acc, p) => acc + (p.capital ?? 0), 0));
healthData.push(items.reduce((acc, p) => acc + (p.health ?? 0), 0));
influenceData.push(items.reduce((acc, p) => acc + (p.influence ?? 0), 0));
happyData.push(items.reduce((acc, p) => acc + (p.happy ?? 0), 0));
processData.push(items.reduce((acc, p) => acc + (p.process ?? 0), 0));
});

// 3. Формируем объект для Charts
const chartData = {
type: 'line', // или 'bar', если хочешь столбцы
data: {
labels: labels,
datasets: [
{ label: '💰 Капитал', data: capitalData, borderColor: 'rgba(0, 128, 0, 1)', backgroundColor: 'rgba(0, 128, 0, 0.2)', fill: false, tension: 0.2 },
{ label: '🫀 Здоровье', data: healthData, borderColor: 'rgba(0, 206, 209, 1)', backgroundColor: 'rgba(0, 206, 209, 0.2)', fill: false, tension: 0.2 },
{ label: '📢 Влияние', data: influenceData, borderColor: 'rgba(168, 130, 255, 1)', backgroundColor: 'rgba(168, 130, 255, 0.2)', fill: false, tension: 0.2 },
{ label: '☀️ Счастье', data: happyData, borderColor: 'rgba(255, 165, 0, 1)', backgroundColor: 'rgba(255, 165, 0, 0.2)', fill: false, tension: 0.2 },
{ label: '📝 Процессинг', data: processData, borderColor: 'rgba(255, 105, 180, 1)', backgroundColor: 'rgba(255, 105, 180, 0.2)', fill: false, tension: 0.2 },

]
}
};

// 4. Рендерим график
window.renderChart(chartData, this.container);
```

#life_rpg
More from @graymanfm
  1. Jul 1, 2026Апдейт по Obsidian Life RPG (01.07.2026) С прошлого апдейта добавилось не так много нововв…
  2. Jun 23, 2026Троттер "Стадный инстинкт" Верить в то, что у тебя нет предрассудков, значит поощрять забл…
  3. Jun 20, 2026Александр III С удивлением открыл для себя, что на ютубе есть огромный цикл лекций нынешне…
  4. Jun 18, 2026Джей Ди Вэнс Произошло очередное эпохальное событие. Джей Ди (почему то всегда хочется доб…
  5. Jun 15, 2026Про спекулятивный рынок В инвестировании есть две слабо пересекающиеся религии: Купил и за…
  6. Jun 14, 2026🏕 Глэмпингорадка Пару лет назад, по понятным на то причинам (ковид), в стране стал развив…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →