Оцифровка графика в excel

Исследование аналоговых сигналов гораздо более интересно, чем расшифровка цифровых, и в этом уроке мы поговорим о такой ситуации, когда нужно оцифровать и “запомнить” в микроконтроллере аналоговый сигнал. Как и зачем это может быть нужно? Чаще всего это встречается в случаях, когда некий датчик выдаёт сигнал в зависимости от каких-то внешних условий, например термистор меняет сопротивление в зависимости от температуры, потенциометр меняет сопротивление в зависимости от угла поворота, фоторезистор меняет сопротивление в зависимости от освещённости, а датчик холла выдаёт напряжение в зависимости от интенсивности магнитного поля. Как найти измеряемую физическую величину, зная “сырой” сигнал с датчика? Правильно, нужно сообщить микроконтроллеру, какой величине какой сигнал соответствует. Такой процесс называется тарированием. В целом существует два подхода:

  • Аппроксимировать соответствие между сигналом и величиной при помощи функции, то есть величина v станет функцией f от сигнала s: v = f(s). Функция может быть какой угодно: линейная зависимость, квадратичная, экспоненциальная, логарифмическая и даже их смеси в виде кусочных функций. Например, зависимость между температурой и сопротивлением термистора описывается уравнением Стейнхарта-Харта, что позволяет определить температуру любого термистора, зная его характеристики и сопротивление (“сигнал”).
    • Плюсы: получение значения вне исследованного диапазона, так как поведение графика “предсказывается” аппроксимирующей функцией. Малый размер в памяти, фактически пара строк кода с вычислениями.
    • Минусы: вычисления, особенно float, логарифмы и степенные функции, занимают значительное время (десятки микросекунд).
  • Создать таблицу (массив) значений сигнала и соответствующей ему величины. Проблема в том, что аналоговый сигнал непрерывен, то есть имеет условно бесконечно большое разрешение: можно разбить график на бесконечное количество точек, и каждой будет соответствовать разное значение! А память микроконтроллера у нас не резиновая =) Так что придётся ограничиться конечным разрешением оцифровки, либо использовать более хитрые трюки, о которых мы поговорим ниже.
    • Плюсы: оцифровка графика любой формы, высокое соответствие с реальным значением, максимально быстрое получение значения (отсутствуют вычисления).
    • Минусы: таблица занимает много места в памяти, разрешение конечное.

Поводом для создания этого урока послужил пост у нас в сообществе, где человек просил помочь с тарированием вот этих двух графиков (получены с условного аналогового датчика расстояния путём ручного измерения сигнала в нескольких точках): Эти графики идеально подходят для разбора данной темы, поэтому попробуем создать их цифровые модели обоими способами. Ниже прилагаю исходный набор точек графиков для тех, кто захочет поиграться с ними самостоятельно. Первый столбец – сигнал (ось x), второй – значение (ось y). Внимание! График на первой картинке отображён со сменой осей. Далее в уроке мы используем горизонтальную ось сигнала, а вертикальную – значения.

График 1

405	10
385	15
375	20
363	25
350	30
338	35
323	40
309	45
297	50
288	55

График 2

145	35
148	36
151	37
156	38
160	39
165	40
170	41
175	42
180	43
186	44
190	45
196	46
200	47
205	48
209	49
212	50
217	51
221	52
224	53
227	54
230	55
233	56
235	57
237	58
240	59
242	60
245	61
246	62
249	63
251	64
253	65
255	66
257	67
259	68
261	69
263	70
264	71
266	72
267	73
268	74
269	75
269	76
269	77
270	78
272	79
276	80
281	81
289	82
298	83
303	84
315	85
327	86
343	87
364	88
410	89

Аппроксимация функцией

Линейная зависимость


Первый график очень близок к линейной зависимости, поэтому можно аппроксимировать его прямой линией от первой точки до последней, то есть вот так: Эта задача решается максимально просто: в Arduino у нас есть замечательная функция map(), которая позволяет перевести один диапазон значений в другой, и делает это как раз линейно. Напомню, что функция map() принимает аргументы: map(значение, мин, макс, новый мин, новый макс). Несложно представить, что находится “внутри” этой функции: школьное уравнение прямой линии, проходящей через две точки. Мы задаём крайние точки и получаем готовую функцию, в программе это можно оформить так:

int getVal(int signal) {
  return map(signal, 405, 288, 10, 55);
}

Как вы могли заметить, я указал диапазон значений с датчика (405, 288) и соответствующее им реальное значение (10, 55). И всё! Кстати, функция будет работать именно как уравнение прямой: если с датчика придёт значение меньше 288 или больше 405, функция вернёт величину согласно пропорции, как по красной линии на картинке выше. Как вы могли заметить, “проведение” прямой пропорциональности через крайние точки даёт не самый хороший результат: его погрешность будет неравномерной. Что делать, если график выглядит вот так, и его хочется аппроксимировать прямой, которая обеспечит наименьшее отклонение? Да, можно просто подобрать крайние точки для map() вручную и всё. А как быть с более сложными графиками или более высокими требованиями к точности аппроксимации?

Аппроксимация в Excel


В MS Office Excel данная возможность называется линией тренда. Добавим данные в столбцы (слева сигнал, справа значение), создадим график, добавим линию тренда и выведем её уравнение на область графика: Таким образом значения величины с датчика можно будет получить при помощи функции:

float getVal(int signal) {
  return (-0.386 * signal + 165);
}

Перейдём ко второму, более интересному графику.

“Сложная” аппроксимация в Excel


Для аппроксимации графиков другой формы можно попробовать другие варианты из предложенных. Загрузим второй график и попробуем создать линии тренда разных “типов”: Упс! График не получается аппроксимировать при помощи простейших функций. Но не беда: в данном графике наблюдается чёткая смена характеристики примерно в середине, а конкретно – при сигнале 269. Давайте разделим график на два отдельных графика и попробуем аппроксимировать их по отдельности: Обе части графика удалось аппроксимировать при помощи полинома с довольно таки хорошей точностью. Итак, у нас есть два уравнения и диапазоны, в которых они “работают”. Осталось добавить соответствующее условие и наша аппроксимирующая функция готова!

float getVal(int signal) {
  if (signal <= 269) return (0.0019 * signal * signal - 0.5117 * signal + 70.605);
  else return (-0.0007 * signal * signal - 0.5295 * signal - 14.978);
}

Вот таким образом можно решить задачу даже для неприятного на вид графика.

Таблица соответствий


Таблица – сохранённые в памяти точки графика, позволяющие найти значение по соответствующему сигналу. С таблицей есть два варианта:

  • Двухмерная таблица. Один столбец хранит сигнал, второй – соответствующее ему значение. Для сложного графика можно оптимизировать размер таблицы, сделав меньше точек на прямых участках, и больше – на участках сложной формы. Заполняется такая таблица последовательно с любым шагом, потому что в дальнейшем мы будем делать поиск по таблице. Чем больше таблица, тем дольше будет происходить поиск дальних значений (речь идёт о единицах микросекунд, не более).
  • Одномерная таблица. Такая таблица заполняется с равным шагом по оси сигнала, а находятся в ней значения. Доступ к таблице осуществляется через преобразование сигнала к номеру ячейки, что позволяет получить одинаковое и минимальное время поиска для таблицы любого размера (фактически это не поиск, а выбор конкретной ячейки). Такой тип таблицы использует в два раза меньше памяти, чем двумерная таблица, а также имеет максимальную скорость доступа. Для критичных ко времени преобразований следует отдать предпочтение этому способу, ведь он будет даже быстрее, чем аппроксимация функцией.

Метод таблиц позволяет более точно и близко к реальному графику найти “значение” по “сигналу”, и тут есть интересные моменты:

  • Таблица, очевидно, будет занимать гораздо больше места в памяти МК. Таблицу можно и нужно разместить в PROGMEM – постоянной памяти, об этом мы говорили в соответствующем уроке и я покажу это ниже здесь.
  • Табличный способ позволяет оцифровать график абсолютно любой формы. В отличие от аппроксимации функцией, его не нужно будет исследовать и разбивать на части, описываемые простейшими функциями.
  • Чем сильнее мы раздробим график, то есть чем больше точек будет в таблице, тем точнее будет определение “значения” и тем меньше будет его минимальный шаг (см. картинку ниже). Занимаемый таблицей объём памяти также увеличится.

Начнём с простой двухмерной таблицы и поиска по ней.

Простая таблица


Таблицей в программе будет являться двумерный массив, давайте создадим его для второго графика с таким же шагом, как на предыдущем скриншоте справа (приблизительно в три раза меньше точек, чем в изначальной таблице, т.е. понизим разрешение оцифровки):

int table[][2] = {
  {145, 35},
  {156, 38},
  {170, 41},
  {186, 44},
  {200, 47},
  {212, 50},
  {224, 53},
  {233, 56},
  {240, 59},
  {246, 62},
  {253, 65},
  {259, 68},
  {264, 71},
  {268, 74},
  {269, 77},
  {276, 80},
  {298, 83},
  {327, 86},
  {410, 89},
};

Для поиска по таблице достаточно просто перебирать все ячейки, начиная с первой. Если сигнал в следующей ячейке будет больше, чем текущий сигнал, считаем текущую ячейку искомой:

int getVal(int signal) {  
  // поиск
  for (int i = 0; i < tableSize - 1; i++) {
    // если сигнал в следующей ячейке больше -
    // вернуть значение в текущей ячейке
    if (table[i + 1][0] > signal) return table[i][1];
  }

  // вернуть последний, если вылетели за диапазон
  return table[tableSize - 1][1];
}

Результат работы функции для нашего диапазона сигналов: Вот такая получается ступенчатая конструкция, для уменьшения погрешности нужно брать больше точек, или… заменить ступеньки между точками линейным отрезком, вот так: Делается это очень просто, просто добавляем map() между соседними точками:

int getVal(int signal) {
  if (signal < table[0][0]) return table[0][1];
  // поиск
  for (int i = 0; i < tableSize - 1; i++) {
    // если сигнал в следующей ячейке больше -
    // вернуть значение по линейному отрезку между точками
    if (table[i + 1][0] > signal)
      return map(signal, table[i][0], table[i + 1][0], table[i][1], table[i + 1][1]);
  }

  // вернуть последний, если вылетели за диапазон
  return table[tableSize - 1][1];
}

Результат (примечание: ступеньки по вертикальной оси справа связаны с целочисленным вычислением значения, т.е. шаг ступеньки там – единица): Лучше? Лучше! Таким образом можно добиться максимальной близости к реальному графику при помощи минимального количества точек в таблице.

Прячем в PROGMEM


Для хранения массива в программной памяти достаточно добавить ключевое слово PROGMEM при объявлении, а также сделать функцию или макрос, которая будет доставать данные из pgm:

const int tableSize = 19;
const int table[][2] PROGMEM = {
  {145, 35},
  {156, 38},
  {170, 41},
  {186, 44},
  {200, 47},
  {212, 50},
  {224, 53},
  {233, 56},
  {240, 59},
  {246, 62},
  {253, 65},
  {259, 68},
  {264, 71},
  {268, 74},
  {269, 77},
  {276, 80},
  {298, 83},
  {327, 86},
  {410, 89},
};

void setup() {
  Serial.begin(9600);
  for (int i = 100; i < 430; i += 5) {
    Serial.print(i);
    Serial.print('t');
    Serial.println(getVal(i));
  }
}

#define pgm_table(x, y) pgm_read_word(&table[(x)][(y)])
int getVal(int signal) {
  if (signal < pgm_table(0, 0)) return pgm_table(0, 1);

  // поиск
  for (int i = 0; i < tableSize - 1; i++) {
    // если сигнал в следующей ячейке больше -
    // вернуть значение в текущей ячейке
    if (pgm_table(i + 1, 0) > signal)
      return map(signal, pgm_table(i, 0), pgm_table(i + 1, 0), pgm_table(i, 1), pgm_table(i + 1, 1));
  }

  // вернуть последний, если вылетели за диапазон
  return pgm_table(tableSize - 1, 1);
}

void loop() {}

Библиотека Approxy (NEW)


Показанный выше вариант с таблицей я обернул в библиотеку Approxy. Рассмотрим пример из неё с такими же исходными данными. Вариант с хранением в PROGMEM:

#include <Approxy.h>

// двумерный массив, у столбцов одинаковый тип
const int tab[][2] PROGMEM = {
  {145, 35},
  {156, 38},
  {170, 41},
  {186, 44},
  {200, 47},
  {212, 50},
  {224, 53},
  {233, 56},
  {240, 59},
  {246, 62},
  {253, 65},
  {259, 68},
  {264, 71},
  {268, 74},
  {269, 77},
  {276, 80},
  {298, 83},
  {327, 86},
  {410, 89},
};

Approxy2D<int, AP_PGM> table(tab, 19);

void setup() {
  Serial.begin(9600);
  for (int i = 145; i < 410; i++) {
    Serial.println(table.get(i));
  }
}

void loop() {}

Линейная таблица


Для создания линейной таблицы нужно производить измерения, строго придерживаясь одинакового шага по сигналу. В саму таблицу идут соответствующие значения. Пример выборки по всё тому же второму графику с шагом по сигналу 10:

140	35
150	36
160	39
170	41
180	43
190	45
200	47
210	49
220	51
230	55
240	59
250	63
260	68
270	78
280	80
290	82
300	83
310	84
320	85
330	86
340	86
350	87
360	87
370	88
380	88
390	88
400	88
410	89

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

int table[] = {
  35, 36, 39, 41, 43, 45, 47, 49, 51, 55, 59, 63, 68, 78,
  80, 82, 83, 84, 85, 86, 86, 87, 87, 88, 88, 88, 88, 89,
};
const int minSignal = 140;
const int maxSignal = 410;
const int tableSize = 28;

void setup() {
  Serial.begin(9600);
  for (int i = 100; i < 430; i += 5) {
    Serial.print(i);
    Serial.print('t');
    Serial.println(getVal(i));
  }
}

int getVal(int signal) {
  // ограничиваем сигнал
  signal = constrain(signal, minSignal, maxSignal);

  // ищем номер ячейки 
  int i = map(signal, minSignal, maxSignal, 0, tableSize - 1);

  // возвращаем значение
  return table[i];
}

void loop() {}

И точно так же массив можно запрятать в прогмем:

int getVal(int signal) {
  // ограничиваем сигнал
  signal = constrain(signal, minSignal, maxSignal);

  // ищем номер ячейки 
  int i = map(signal, minSignal, maxSignal, 0, tableSize - 1);

  // возвращаем значение
  return pgm_read_word(&table[i]);
}

Линеаризовать переходы между точками в этом случае труднее, но тоже можно: зная шаг изменения сигнала (он у нас одинаковый) и его начальное значение, восстановим соответствующие точкам значения:

int table[] = {
  35, 39, 43, 47, 51, 59, 68, 80, 83, 85, 86, 87, 88, 88,
};
const int minSignal = 140;
const int maxSignal = 400;
const int stepSignal = 20;
const int tableSize = 14;

void setup() {
  Serial.begin(9600);
  for (int i = 100; i < 430; i += 5) {
    Serial.print(i);
    Serial.print('t');
    Serial.println(getVal(i));
  }
}

int getVal(int signal) {
  // ограничиваем сигнал
  signal = constrain(signal, minSignal, maxSignal);

  // ищем номер ячейки
  // ещё -1 за счёт линеаризации!
  int i = map(signal, minSignal, maxSignal-stepSignal, 0, tableSize - 2);

  int thisMin = stepSignal * i + minSignal;
  int thisMax = thisMin + stepSignal;

  // возвращаем значение
  return map(signal, thisMin, thisMax, table[i], table[i + 1]);
}

void loop() {}

И вот так мы восстановили график значения от сигнала всего по 14 точкам в одномерном массиве, зная минимум, максимум и шаг изменения сигнала! 

float map()?


Для линеаризации в предыдущих примерах мы использовали функцию map(), которая возвращает целые числа. Что делать, если нужна более высокая точность? Можно работать в более мелкой шкале (например миллиметры вместо сантиметров), а можно сделать свой map, который будет считать во float:

float map_f(long x, long in_min, long in_max, long out_min, long out_max) {
  return (float)(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

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

Что выбрать?


Плюсы, минусы и особенности всех способов мы уже разобрали выше. Какой выбрать для своей задачи? Если время вычисления не критично и график можно аппроксимировать функцией – однозначно лучше сделать так. Если график сложный и выдержать ровный шаг изменения сигнала при ручном тарировании сложно – делать двумерную таблицу с поиском. Если при ручном изменении есть возможность четко контролировать сигнал – есть смысл заморочиться и сделать одномерную таблицу, ведь с ней можно добиться вдвое большего разрешения оцифровки, чем с двумерной таблицей такого же “веса”!

Полезные страницы


  • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])

1. Введение
Программа Grafula написана в далеком 1999 году для Windows, бесплатная, имеет интуитивно понятный интерфейс для пользователей.
Данная программа позволяет перевести в числовую форму данные, представленные в виде нарисованного или отпечатанного на бумаге графика, отсканированного и сохраненного в виде рисунка. К примеру, какой-либо прибор в качестве своих выходных данных выдал не набор цифр, а их графическое представление — график. В этом случае введение этих данных в компьютер для дальнейшей обработки становится трудной задачей, так как приходится внимательно исследовать график, измеряя и фиксируя его значения в различных точках, чтобы составить таблицу значений, которую уже можно набрать в каком-либо редакторе. Программа Grafula позволяет автоматизировать этот процесс, значительно его облегчив. Отсканировав график, можно загрузить его в Graful‘у, а затем в окне программ расставить по графику точки. Для этих точек автоматически будут вычислены их координаты и записаны в таблицу, которую можно скопировать в любую другую программу, например в Excel.

2. Краткая инструкция
Итак, предположим, что у нас имеется некоторый старый график и мы не знаем точно какие значения были получены. Например как на графике изображенном на рисунке 1.

Рисунок 1. Пример графика из которого нужно получить экспериментальные значения

Откроем наш файл в программе Grafula (см.рисунок 2).

Рисунок 2. Открытие рисунка в программе Grafula

Далее выбираем начальную точку (Указание точки 0,0), и максимальные значения по координатным осям (Указание точки MaxX, Указание точки MaxY). В настройках выбираем тип шкалы по X и по Y (рисунок 3). Для нашего случая Тип шкалы по X — десятичный логарифм, по Y — нормальная.

Рисунок 3. Окно настроек программы Grafula

В результате для исследуемого графика получаем следующие данные:
8,56713914996779 0,576744186046512
17936,2373905283 0,576744186046512
59719,9455365749 0,576744186046512
129401,794346583 0,725581395348837
236120,844786349 0,967441860465116
362828,582869067 1,24651162790698
721454,514283565 1,89767441860465
96621689,4324125 3,53488372093023

Программу можно загрузить отсюда.

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Уважаемые знатоки,

Возник вопрос по получению данных, с графика ниже.
в чем суть;
Есть значения по X, от 0 до 160, нужно, чтобы в экселе(рисунок справа), в зависимости от моего числа X(RBS RMR), мне выдавал результат Y. Т.е для значения 20 , рейтинг будет = 10, и так далее.  

Прикрепленные файлы

  • 1.PNG (4.76 КБ)
  • 2.PNG (8.33 КБ)
  • Graph.xlsx (14.48 КБ)

Изменено: teomatau19.09.2019 08:19:51

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

teomatau, на форуме по Excel и файлы нужно прикреплять соответствующие, а не рисунки.

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

 

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Дмитрий(The_Prist) Щербаков,отсюда вытекает второй вопрос, как можно достовернее отрисовать ( оцифровать график).

Пытался сделать уравнение с помощью логарифма, но что-то нет.

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

19.09.2019 08:43:06

Цитата
teomatau написал:
как можно достовернее отрисовать

получить все необходимые данные. Вы хотите достоверно отрисовать график только на основании X, без Y? и как этот Y получить тоже не знаете? Нужна хотя бы исходная формула вычисления Y на основании X. Без этого ничего не выйдет, я думаю. Возможно туплю и ошибаюсь. Я просто откровенно не понимаю что мы вообще вычисляем.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Дмитрий(The_Prist) Щербаков,я скорее всего неправильно все объяснил.

Есть значения в MPa, в зависимости от этих значений, смотря на кривую, мне необходимо выбрать рейтинг, для каждого значения.
Например: Для значения 10 МПа, рейтинг будет составлять 5. для значения 20 МПа, рейтинг соотстветственно 10, и так далее.
Мне нужна формула, чтобы при подставке значений МПа в столбик, мне рядом выдавало значение Рейтинга

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Доброе время суток.
Данные оцифровки — далее обычная линейная интерполяция между двумя точками по X.

0 0
4,63768115942029 2,20037453183521
8,94409937888199 4,30711610486891
14,2443064182195 6,60112359550562
19,3788819875776 8,61423220973783
23,8509316770186 10,3932584269663
29,9792960662526 12,3595505617978
35,6107660455487 13,9044943820225
40,2484472049689 14,934456928839
46,8737060041408 16,1048689138577
53,8302277432712 17,0880149812734
64,7619047619048 18,4456928838951
73,7060041407867 19,2883895131086
87,7846790890269 20,4588014981273
111,635610766046 22,1910112359551
130,848861283644 23,314606741573
147,080745341615 24,3445692883895
160 25
 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Всем спасибо, с темой разобрался. Кому интересно , во вложении  

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#10

19.09.2019 09:12:09

Цитата
teomatau написал:
с темой разобрался

В разобранном при Х = 20, У = 9, а утверждалось

Цитата
teomatau написал:
Т.е для значения 20 , рейтинг будет = 10

У меня получилось для 20, У = 8,9 (если округлять до десятых).
Плюс/минус лапоть допустим?

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Андрей VG,вы абсолютно правы, приглядевшись к графику, я заметил, что 20  — это действительно 8.9-9.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#12

19.09.2019 09:26:15

Андрей VG, приветствую! А как вы это делали? Ни разу с подобным не сталкивался, но очень интересно  :)

Особенно интересно, почему у обоих чисел хвосты:

    • как вы добились такой точности
    • почему не взяли целые числа X и рассчитали их соответсвия на Y или наоборот

Я бы просто закинул картинку в автокад и повторил оси (орто) и кривую (полилиния+сплайн+ручками). Потом можно бы было получать для любой точки X точку Y и наоборот…

UPD: нашёл программу и понял, откуда «хвосты»

(сюрприз — не оттуда) :D

У меня через прогу вышло вот так

ссылка

на файл программы с обработанным графиком

Статья на Хабре
Родственная тема

Прикрепленные файлы

  • график.png (33.98 КБ)

Изменено: Jack Famous19.09.2019 11:29:27

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Привет, Алексей.
В принципе, всё просто. Оцифровал график полилинией. Макросом сбросил координаты. Зная координаты точек в двух системах координат, пересчитал из одной в другую обычными формулами в столбцах F, G. По поводу точности — не стоит обольщаться. Обычно считается точность вычисления (округление результата) нужно делать в пределах полуширины линии.

Прикрепленные файлы

  • Graph.xlsm (30.67 КБ)

Изменено: Андрей VG19.09.2019 10:17:10

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#14

19.09.2019 10:16:19

Андрей VG, о, а макрос-то я и не заметил)
не думал, что так можно — спасибо за науку!  :idea:

Макрос получения координат

P.S.:

а функцию как получили?)))

Изменено: Jack Famous19.09.2019 10:26:49

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Вопрос снова актуальный) после 40, все таки дает неправильные значения. Например для значения 69 , дает значения 29.5  

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#16

19.09.2019 10:26:43

Цитата
teomatau написал:
Например для значения 69 , дает значения 29.5

Ну, это смотря что использовать для входа. У меня для 69 У = 18,8. Вывод — точнее готовьте данные.

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Андрей VG,не могли бы вы, пожалуйста, прикрепить свой файл?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#18

19.09.2019 10:53:02

Цитата
teomatau написал:
прикрепить свой файл

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

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Андрей VG,я просто не могу понять, куда входные данные вводить?)

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#20

19.09.2019 11:03:18

Цитата
teomatau: не могу понять

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

А вообще у него очень крутой метод использован — обязательно учту на будущее  :idea:

Изменено: Jack Famous19.09.2019 11:04:14

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

Jack Famous,Спасибо,

Просто дело в том, что у меня будут входные данные, от 1 до 400, к которым нужно будет значение рейтинга. Я думал, что будет проще привязать к ним формулы, и при копирование данных, чтобы сразу присваивался рейтинг. Я так понимаю, в программе так не получится?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#22

19.09.2019 11:08:56

Цитата
teomatau написал:
куда входные данные вводить?

Для вашей таблички в файле Graph.xlsx

Код
=ИНДЕКС(yData;ПОИСКПОЗ(A2;xData;1))+(A2-ИНДЕКС(xData;ПОИСКПОЗ(A2;xData;1)))*(ИНДЕКС(yData;ПОИСКПОЗ(A2;xData;1)+1)-ИНДЕКС(yData;ПОИСКПОЗ(A2;xData;1)))/(ИНДЕКС(xData;ПОИСКПОЗ(A2;xData;1)+1)-ИНДЕКС(xData;ПОИСКПОЗ(A2;xData;1)))

где xData — именованный диапазон оцифрованых значений по Х, yData — именованный диапазон оцифрованных значений по Y.

 

teomatau

Пользователь

Сообщений: 17
Регистрация: 19.09.2019

#23

19.09.2019 11:33:59

Андрей VG, Большое спасибо,

с 10 раза понял )

Asked
8 years, 11 months ago

Viewed
19k times

$begingroup$

I’m trying to compare my model results with an experiment. I want to overlap the model curve with experiment curve from a paper.

What are my options for digitizing the graph from an image in the pdf paper to excel data?

asked Apr 22, 2014 at 19:16

user40's user avatar

$endgroup$

1

$begingroup$

answered Apr 23, 2014 at 2:14

Glen_b's user avatar

Glen_bGlen_b

271k36 gold badges590 silver badges989 bronze badges

$endgroup$

$begingroup$

A google search for «digitize graph» brings up several potential solutions.

What is best depends on what tools you are already familiar with and what level of automation vs. fine control that you want. I personally would load the graph into R then use the updateusr function in the TeachingDemos package along with the locator function to find the coordinates of points, but others may prefer other workflows.

answered Apr 22, 2014 at 19:28

Greg Snow's user avatar

Greg SnowGreg Snow

48.5k2 gold badges98 silver badges162 bronze badges

$endgroup$

Содержание

    • 0.1 1. Вставить значения
    • 0.2  2. Вставить форматы
    • 0.3 3. Вставить формулы
    • 0.4 4. Вставить проверку данных
    • 0.5 5. Скопировать ширину столбцов с других ячеек
    • 0.6 6. Берем комментарии и вставляем в другом месте
    • 0.7 7. И конечно, вставляем все подряд
  • 1 Вставка с помощью обработки данных
    • 1.1 8. Вставка с дополнительной математической операцией
    • 1.2 9. Вставка с учетом пустых ячеек
    • 1.3 10. Транспонированная вставка
    • 1.4 11. Вставить ссылку на оригинальную ячейку
    • 1.5 12. Вставить текст с разбивкой по столбцам
    • 1.6 13. Импорт данных из интернета
    • 1.7 14. Какой ваш любимый способ вставки?
  • 2 Синтаксис ВПР
  • 3 Как перемещать данные с помощью ВПР?

1. Введение Программа

Grafula написана в далеком 1999 году для Windows, бесплатная, имеет интуитивно понятный интерфейс для пользователей.

Данная программа позволяет перевести в числовую форму данные, представленные в виде нарисованного или отпечатанного на бумаге графика, отсканированного и сохраненного в виде рисунка. К примеру, какой-либо прибор в качестве своих выходных данных выдал не набор цифр, а их графическое представление — график. В этом случае введение этих данных в компьютер для дальнейшей обработки становится трудной задачей, так как приходится внимательно исследовать график, измеряя и фиксируя его значения в различных точках, чтобы составить таблицу значений, которую уже можно набрать в каком-либо редакторе. Программа Grafula позволяет автоматизировать этот процесс, значительно его облегчив. Отсканировав график, можно загрузить его в

Graful ‘у, а затем в окне программ расставить по графику точки. Для этих точек автоматически будут вычислены их координаты и записаны в таблицу, которую можно скопировать в любую другую программу, например в Excel.

2. Краткая инструкция Итак, предположим, что у нас имеется некоторый старый график и мы не знаем точно какие значения были получены. Например как на графике изображенном на рисунке 1.

как сделать оцифровку данных в excel

Рисунок 1. Пример графика из которого нужно получить экспериментальные значения

Откроем наш файл в программе

Grafula (см.рисунок 2).

Рисунок 2. Открытие рисунка в программе Grafula

Далее выбираем начальную точку (Указание точки 0,0), и максимальные значения по координатным осям (Указание точки

MaxX , Указание точки

MaxY ). В настройках выбираем тип шкалы по

X и по

Y (рисунок 3). Для нашего случая Тип шкалы по

X — десятичный логарифм, по

Y — нормальная.

Рисунок 3. Окно настроек программы Grafula

В результате для исследуемого графика получаем следующие данные:

Программу можно загрузить 

отсюда

.

Здесь можно получить ответы на вопросы по Microsoft Excel 57869 473417

18 Окт 2018 18:54:08

44519 357829

29 Янв 2017 17:28:40

Лучшие избранные темы с основного форума 14 80

28 Июн 2018 15:25:11

Если вы — счастливый обладатель Mac 😉 218 1064

17 Окт 2018 12:17:03

Раздел для размещения платных вопросов, проектов и задач и поиска исполнителей для них. 2113 13459

18 Окт 2018 18:44:22

Если Вы скачали или приобрели надстройку PLEX для Microsoft Excel и у Вас есть вопросы или пожелания — Вам сюда. 313 1591

15 Окт 2018 05:14:43

812 11792

18 Окт 2018 09:51:53

Обсуждение функционала, правил и т.д. 270 3469

13 Окт 2018 19:02:30

Сейчас на форуме (гостей: 870, пользователей: 10, из них скрытых: 1) , , , , , , , ,

Сегодня отмечают день рождения (32), (28)

Всего зарегистрированных пользователей: 83328

Приняло участие в обсуждении: 31933

Всего тем: 106128

Вставка или Ctrl+V, пожалуй, самый эффективный инструмент доступный нам. Но как хорошо вы владеете им? Знаете ли вы, что есть как минимум 14 различных способов вставки данных в листах Ecxel? Удивлены? Тогда читаем этот пост, чтобы стать пэйст-мастером.

Данный пост состоит из 2 частей:

— Основные приемы вставки

— Вставка с помощью обработки данных

1. Вставить значения

Если вы хотите просто вставить значения с  ячеек, последовательно нажимайте клавиши Я, М и З, удерживая при этом клавишу Alt, и в конце нажмите клавишу ввода. Это бывает необходимо, когда вам нужно избавиться от форматирования и работать только с данными.

Начиная с Excel 2010, функция вставки значений отображается во всплывающем меню при нажатии правой клавишей мыши

 2. Вставить форматы

Нравиться этот чудный формат, который сделал ваш коллега? Но у вас нет времени, чтобы так же оформить свою таблицу. Не беспокойтесь, вы можете вставить форматы (включая условное форматирование) из любой скопированной ячейки. Удерживая клавишу Alt, последовательно нажимайте Я, М, Ф, Ф, Ф и в конце нажмите клавишу Ввода.

Те же самые действия можно произвести с помощью меньшего количества операций, воспользовавшись меню, которое выпадает при нажатии правой кнопки мыши (начиная с Excel 2010).

3. Вставить формулы

Иногда возникает необходимость скопировать несколько формул в новый диапазон. Для этого, удерживая клавишу Alt, последовательно нажимаем Я, М, Ф и в конце нажмите клавишу Ввода. Вы можете достичь того же эффекта, путем перетаскивания ячейки, содержащей формулу, в новый диапазон, если диапазон находится рядом.

4. Вставить проверку данных

Хотите скопировать только проверку значений, без содержимого и форматов ячейки. Для этого копируете ячейку, в котором присутствует проверка условий, щелкаете правой кнопкой мыши на ячейку, куда хотите скопировать данные. Выбираете Специальная вставка -> Условия на значения.

как сделать оцифровку данных в excel

5. Скопировать ширину столбцов с других ячеек

Вашему боссу понравилась, созданная вами, табличка по отслеживанию покупок и он попросил создать еще одну, для отслеживания продаж. В новой таблице вы хотите сохранить ширину столбцов. Для этого вам нет необходимости измерять каждый столбец первой таблицы, а просто скопировать их и с помощью специальной вставки задать «Ширина столбцов».

6. Берем комментарии и вставляем в другом месте

Чтобы сократить количество перепечатываний, комментарии тоже можно вставлять копипейстом. Для этого необходимо воспользоваться специальной вставкой и указать «Вставить примечания»

7. И конечно, вставляем все подряд

В этом нам помогут сочетания клавиш Ctrl+V или Alt+Я+М или клавиша вставки на панели инструментов.

Вставка с помощью обработки данных

8. Вставка с дополнительной математической операцией

К примеру, у вас имеется строка 1 со значениями 1, 2, 3, и строка 2 со значениями 4, 5, 6. И вам необходимо сложить обе строки, чтобы получить 5, 7, 9. Для этого копируем первую строку, жмем правой кнопкой мыши по строке 2, выбираем Специальная вставка, ставим переключатель на «Сложить» и жмем ОК.

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

как сделать оцифровку данных в excel

9. Вставка с учетом пустых ячеек

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

как сделать оцифровку данных в excel

В диалоговом окне «Специальная вставка» установите галку «Пропускать пустые ячейки»

10. Транспонированная вставка

как сделать оцифровку данных в excelК примеру, у вас имеется колонка со списком значений, и вам требуется переместить (скопировать) данные в строку (т.е. вставить их поперек). Как бы вы это сделали? Ну конечно, вам следует воспользоваться специальной вставкой и в диалоговом окне установить галку «Транспонировать». Либо воспользоваться сочетанием клавиш Alt+Я, М и А.

Эта операция позволит транспонировать скопированные значения прежде, чем вставит. Таким образом, Excel преобразует строки в столбцы и, наоборот, столбцы в строки.

11. Вставить ссылку на оригинальную ячейку

Если вы хотите создать ссылки на оригинальные ячейки, вместо копипэйстинга значений, этот вариант, то, что вам нужно. Воспользуйтесь специальной вставкой, как примерах выше, и вместо кнопки «ОК» , нажмите «Вставить связь». Либо воспользуйтесь сочетанием клавиш Alt+Я, М и Ь, что создаст автоматическую ссылку на скопированный диапазон ячеек.

12. Вставить текст с разбивкой по столбцам

Эта опция полезна, когда вы вставляете данные извне. Например, если вы хотите вставить несколько строчек этого блога на лист Excel, но при этом каждое слово было в отдельном столбце. Для этого копируем текст (Ctrl+C), переходим на лист Excel и вставляем данные (Ctrl+V). У меня, по умолчанию, программа вставила строку с текстом в одну ячейку. Теперь необходимо проделать небольшой финт ушами. Идем во вкладку «Данные» -> «Текст по столбцам» и настраиваем мастер текстов. На первом шаге указываем формат данных – «с разделителями», жмем «Далее», устанавливаем символ-разделитель —  «Пробел» и «Готово». Текст, который, мы вставили в одну ячейку разбился по столбцам. Таким образом мы указали программе, как бы мы хотели воспринимать текстовые данные.

как сделать оцифровку данных в excel

Теперь, во время последующих вставок текста, кликаем правой кнопкой по ячейке, куда вы хотите вставить текст, выбираем «Специальная вставка» -> «Текст» -> «ОК». Excel разбил нашу строку на столбцы, что нам и требовалось.

как сделать оцифровку данных в excel

13. Импорт данных из интернета

Если вы хотите импортировать данные с интернета в реальном времени, вы можете воспользоваться веб-запросами Excel. Это мощный инструмент, который позволяет извлекать данные из сети (или сетевых ресурсов) и отображает их в виде электронной таблицы. Узнать больше об импорте данных вы можете прочитав статью о веб запросах Excel.

14. Какой ваш любимый способ вставки?

Есть еще много других скрытых способов вставки, таких как вставка XML-данных, изображений, объектов, файлов и т.д. Но мне интересно, какими интересными приемами вставки пользуетесь вы. Напишите, какой ваш любимый способ вставки?

ВПР в Excel – очень полезная функция, позволяющая подтягивать данные из одной таблицы в другую по заданным критериям. Это достаточно «умная» команда, потому что принцип ее работы складывается из нескольких действий: сканирование выбранного массива, выбор нужной ячейки и перенос данных из нее.

Весь процесс просмотра и выборки данных происходит за доли секунды, поэтому результат мы получаем моментально.

Синтаксис ВПР

ВПР расшифровывается как вертикальный просмотр. То есть команда переносит данные из одного столбца в другой. Для работы со строками существует горизонтальный просмотр – ГПР.

Аргументы функции следующие:

  • искомое значение – то, что предполагается искать в таблице;
  • таблица – массив данных, из которых подтягиваются данные. Примечательно, таблица с данными должна находиться правее исходной таблицы, иначе функций ВПР не будет работать;
  • номер столбца таблицы, из которой будут подтягиваться значения;
  • интервальный просмотр – логический аргумент, определяющий точность или приблизительность значения (0 или 1).

Как перемещать данные с помощью ВПР?

Рассмотрим пример на практике. Имеем таблицу, в которой прописываются партии заказанных товаров (она подсвечена зеленым). Справа прайс, где значатся цены каждого товара (подсвечен голубым). Нам нужно перенести данные по ценам из правой таблицы в левую, чтобы подсчитать стоимость каждой партии. Вручную это делать долго, поэтому воспользуемся функцией Вертикального Просмотра.

В ячейку D3 нужно подтянуть цену гречки из правой таблицы. Пишем =ВПР и заполняем аргументы.

Искомым значением будет гречка из ячейки B3. Важно проставить именно номер ячейки, а не слово «гречка», чтобы потом можно было протянуть формулу вниз и автоматически получить остальные значения.

Таблица – выделяем прайс без шапки. Т.е. только сами наименования товаров и их цены. Этот массив мы зафиксируем клавишей F4, чтобы он не изменялся при протягивании формулы.

Номер столбца – в нашем случае это цифра 2, потому что необходимые нам данные (цена) стоят во втором столбце выделенной таблицы (прайса).

Интервальный просмотр – ставим 0, т.к. нам нужны точные значения, а не приблизительные.

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

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

Скачать пример переноса таблицы через ВПР

Вот так, с помощью элементарных действий можно подставлять значения из одной таблицы в другую. Важно помнить, что функция Вертикального Просмотра работает только если таблица, из которой подтягиваются данные, находится справа. В противном случае, нужно переместить ее или воспользоваться командой ИНДЕКС и ПОИСКПОЗ. Овладев этими двумя функциями вы сможете намного больше реализовать сложных решений чем те возможности, которые предоставляет функция ВПР или ГПР.

Like this post? Please share to your friends:
  • Оценка эффективности инвестиционного проекта пример расчета в excel
  • Оценки учеников в excel
  • Оценка тренда в excel
  • Оценки коэффициентов линейной регрессии excel
  • Оценка стоимости компании пример excel