Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Mike_Kharkov
7 / 0 / 1
Регистрация: 16.10.2015
Сообщений: 64

Matplotlib. Глюк при отображении цены

21.10.2016, 00:13. Показов 1300. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
В программировании я чайник(лутца еще не прочел до конца) - но кое что пытаюсь писать для себя по немногу:
(сам верстальщик сайтов).

При попытке отрисовать значения котировок в окне сталкиваюсь с проблемой того, что когда значений(отметок) еще мало(до 500-сот) - шкала цены(ось Y) не адекватно отображает лимиты ценового диапазона:
(скрин прикрепил.)
Первые пять отметок(цен) должны отображаться примерно в районе 1.12....
Но как видно из скрина этого не происходит..
Если же ценовых отметок становится больше 1000 - в этом случае отображение работает +- норм.:

Вопрос:
Что я не до указал в матплотлибе для корректного масштабирования?
(очень плохо пока что знаком с этой либой + на инглише тяжело дается чтение(если это можно чтением назвать) этой доки..)

Код выглядит следующим образом:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import matplotlib
import matplotlib.pyplot as plt
from datetime import date
 
class Trading_Operations():
 
    def __init__(self):  # Инициализация
 
        self.ticker = []
        self.date = []
        self.time_str = []
        self.time_int = []
        self.open = []
        self.high = []
        self.low = []
        self.close = []
        self.volume = []
 
 
    def rendering_text_file(self):  # Обработка текстовых данных
 
        open_text = open('C:/Users/Mike/Desktop/EURUSD.txt', 'r')
 
        i = 0   # счетчик для цикла
 
        for line in open_text:
 
            line = line.rstrip('\n')
 
            if line == str(''):
                continue
 
            if i >= 6: # останавливаем цикл(обработку текста) после прохода i-й строки
                open_text.close()
                break
 
            if i > 0: # Пропускаем первую строку в текстовом файле
 
                line = line.split(',')
 
                self.ticker.append(str(line[0]))
 
                self.date.append(str(line[1]))
 
                self.time_str.append(str(line[2][0:2] + ':' + line[2][2:4] + ":" + line[2][4:6]))
                self.time_int.append(int(line[2]))
                self.open.append(float(line[3]))
                self.high.append(float(line[4]))
                self.low.append(float(line[5]))
                self.close.append(float(line[6]))
                self.volume.append(int(line[7]))
 
                print(self.ticker, self.date, self.time_str, self.open, self.high, self.low, self.close, self.volume)
 
            i = i + 1
 
 
    def drawing_with_matplotlib(self):  # Нанесение полученных данных на координатную плоскость
 
 
        fig = plt.figure()
        ax = fig.add_subplot(111)
 
        xdata = [date(int(self.date[x][0:4]), int(self.date[x][4:6]), int(self.date[x][6:8])) for x in range(len(self.date))]
 
        # Данные, которые будут отложены по оси Y
        ydata = self.open
 
        # Преобразуем даты в числовой формат
        xdata_float = matplotlib.dates.date2num(xdata)
 
        # Пусть в качестве меток по оси X выводится только год
        ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%d. %m. %Y"))
 
        # Отобразим данные
        plt.plot(xdata_float, ydata)
        plt.plot_date(xdata_float, ydata, fmt="b-")
 
        plt.grid()
        plt.show()
 
trad_oper = Trading_Operations()
trad_oper.rendering_text_file()
trad_oper.drawing_with_matplotlib()
P.S. Буду благодарен за любые конструктивные советы..
Миниатюры
Matplotlib. Глюк при отображении цены  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.10.2016, 00:13
Ответы с готовыми решениями:

Изменение цены и расчета стоимости при изменении вида цены и валюты
Здравствуйте! Помогите пжл решить такую задачу. Есть Обработка с табличной частью. В шапке Покупатель, Склад, Вид цены и валюта. В...

Ускорение обновления графика matplotlib с использованием matplotlib.animation
Всем добрый день. Я пытаюсь оптимизировать вывод графиков matplotlib в режиме реального времени. Пробовал реализовать через plt.plot и...

matplotlib.pyplot работает, а matplotlib нет
Не могу понять. Почему import matplotlib.pyplot as plt x = plt.plot(x) plt.show() спокойно выдает график, а import...

8
 Аватар для ilnurgi
141 / 141 / 38
Регистрация: 20.02.2012
Сообщений: 597
21.10.2016, 10:20
прикрепи файл с данными, в которой ошибка и в которой норм
1
 Аватар для Mike_Kharkov
7 / 0 / 1
Регистрация: 16.10.2015
Сообщений: 64
21.10.2016, 13:36  [ТС]
Ссылка на скачиание зипа.(необходимо распаковать.)
https://yadi.sk/d/GvKGULrzxJUt2https://yadi.sk/d/GvKGULrzxJUt2

Далее:
Есть вот такая вот строка( if i >= 6: # останавливаем цикл(обработку текста) после прохода i-й строки)
Если вместо 6-ть поставить 3000 например - то график будет нормально отображаеться..
Если же где то в районе до 1000-чи то работает с вышеописанными мною глюками..


И еще у меня вопрос по работе кода появился:
(ниже текущая версия его)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import matplotlib
import matplotlib.pyplot as plt
from datetime import date
 
class Trading_Operations():
 
    def __init__(self):  # Инициализация
 
        self.ticker = []
        self.date = []
        self.time_str = []
        self.time_int = []
        self.open = []
        self.high = []
        self.low = []
        self.close = []
        self.volume = []
 
 
    def rendering_text_file(self):  # Обработка текстовых данных
 
        open_text = open('C:/Users/Mike/Desktop/EURUSD.txt', 'r')
 
        i = 0   # счетчик для цикла
 
        for line in open_text:
 
            line = line.rstrip('\n')
 
            if line == str(''):
                continue
 
            if i >= 6: # останавливаем цикл(обработку текста) после прохода i-й строки
                open_text.close()
                break
 
            if i > 0: # Пропускаем первую строку в текстовом файле
 
                line = line.split(',')
 
                self.ticker.append(str(line[0]))
 
                self.date.append(str(line[1]))
 
                self.time_str.append(str(line[2][0:2] + ':' + line[2][2:4] + ":" + line[2][4:6]))
                self.time_int.append(int(line[2]))
                self.open.append(float(line[3]))
                self.high.append(float(line[4]))
                self.low.append(float(line[5]))
                self.close.append(float(line[6]))
                self.volume.append(int(line[7]))
 
                #print(self.ticker, self.date, self.time_str, self.open, self.high, self.low, self.close, self.volume)
 
            i = i + 1
 
 
    def drawing_with_matplotlib(self):  # Нанесение полученных данных на координатную плоскость
 
 
        fig = plt.figure()
        ax = fig.add_subplot(111)
 
        xdata = [date(int(self.date[x][0:4]), int(self.date[x][4:6]), int(self.date[x][6:8])) for x in range(len(self.date))]
 
        # Данные, которые будут отложены по оси Y
        ydata = self.open
 
        # Преобразуем даты в числовой формат
        xdata_float = matplotlib.dates.date2num(xdata)
 
        # Пусть в качестве меток по оси X выводится только год
        ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%d. %m. %Y"))
 
        # Отобразим данные
        plt.plot(xdata_float, ydata)
        plt.plot_date(xdata_float, ydata, fmt="b-")
 
        plt.title('Price EUR/USD')
        plt.xlabel('Day of Year')
 
        for tick in ax.yaxis.get_major_ticks():
 
            tick.label1On = True
            tick.label1.set_color('black')
            tick.label2On = True
            tick.label2.set_color('green')
 
            # серые деления на оси ОY слева
            tick.tick1line.set_color('red')
            tick.tick1line.set_markeredgewidth(2)
            tick.tick1line.set_markersize(1)
 
            tick.tick2line.set_color('red')
            tick.tick2line.set_markeredgewidth(2)
            tick.tick2line.set_markersize(1)
 
        plt.grid()
        plt.show()
 
trad_oper = Trading_Operations()
trad_oper.rendering_text_file()
trad_oper.drawing_with_matplotlib()
После вызова окна ОЗУ продолжает нагружаться:
(скрин прикрепил)

Вопрос:
Почему это происходит?
(подозреваю, что то то с алгоритмами я нахимичил(в участке кода отвечающем за работу матплотлиб.) )
Миниатюры
Matplotlib. Глюк при отображении цены  
0
 Аватар для ilnurgi
141 / 141 / 38
Регистрация: 20.02.2012
Сообщений: 597
21.10.2016, 15:21
чето я так и не понял первую проблему.

пока я вижу что у тебя много лишних операции

Python
1
for line in open('C:/Users/Mike/Desktop/EURUSD.txt', 'r'):
Python
1
line = line.strip()
Python
1
2
if not line:
     continue
Python
1
2
# не надо тут и далее str, они и так str
self.ticker.append(str(line[0]))
у вас вроде много данных, можно сделать микрооптимизацию, по аналогии везде

Python
1
2
3
4
5
6
7
8
ticker_append = self.ticker.append
 
for line in open('C:/Users/Mike/Desktop/EURUSD.txt', 'r'):
 
...
 
                ticker_append(line[0])
...
Добавлено через 4 минуты
на счет второй проблемы, он не продолжает загружаться, у вас много данных (10 лямов строк) поэтому скрипт съедает много памяти
1
 Аватар для Mike_Kharkov
7 / 0 / 1
Регистрация: 16.10.2015
Сообщений: 64
21.10.2016, 15:39  [ТС]
Цитата Сообщение от ilnurgi Посмотреть сообщение
чето я так и не понял первую проблему.
Вот смотрите график с пятью отметками в районе 1.12:
https://yadi.sk/i/3MKqoG0vxJyYU

На нем с лева по оси Y не видно ценовой шкалы 1.12 вообще(только цены в районе 10 центов) - то есть идет некорректное автомасштабирование.

А вот например график с обьемами в 5000000 строк:
https://yadi.sk/i/iLzzQ6SQxGeXt

И на нем уже можно наблюдать с самого начала(в том числе и первые 5 отметок ценовых) в корректном виде(где все отображено по оси Y)

Вы поняли суть 1-й проблемы?

Добавлено через 3 минуты
Цитата Сообщение от ilnurgi Посмотреть сообщение
на счет второй проблемы, он не продолжает загружаться, у вас много данных (10 лямов строк) поэтому скрипт съедает много памяти
Вот тут я не совсем пойму - вроде же отображается по сути только картинка и вся работа уже выполнена по идее.
Почему ОЗУ то нагружается?
(Не силен в этих моментах пока что..)
0
 Аватар для ilnurgi
141 / 141 / 38
Регистрация: 20.02.2012
Сообщений: 597
21.10.2016, 15:40
Лучший ответ Сообщение было отмечено Mike_Kharkov как решение

Решение

т.е. вы не хотите видеть 0.0002, 0.0004 .... а сразу 1.1216 .....?
1
 Аватар для Mike_Kharkov
7 / 0 / 1
Регистрация: 16.10.2015
Сообщений: 64
21.10.2016, 15:41  [ТС]
Цитата Сообщение от ilnurgi Посмотреть сообщение
т.е. вы не хотите видеть 0.0002, 0.0004 .... а сразу 1.1216 .....?
ну в общем мне необходимо что бы все всегда отображалось на графике - т.к. это происходит в примере с 5 000 000 строк
И например что бы была видна цена 1.12... где то +- по середине чарта(по оси Y).
(если данных очень мало)
0
 Аватар для ilnurgi
141 / 141 / 38
Регистрация: 20.02.2012
Сообщений: 597
21.10.2016, 15:56
Цитата Сообщение от Mike_Kharkov Посмотреть сообщение
Почему ОЗУ то нагружается?
вы открываете файл, читаете данные, много их, все храните в озу при этом. далее картинка строится по данным, которые у вас в озу лежат.

выже можете сохранить эту картинку, и смотреть картинку потом когда угодно.

и ещё, если я не ошибасюь, можно не хранить все в памяти а сразу наносить их в плот, если не ошибаюсь

Добавлено через 13 минут
я чето не вкурю как избавиться от первой проблемы, попробуй отписаться этому человеку http://jenyay.net/Main/Contact
0
 Аватар для Mike_Kharkov
7 / 0 / 1
Регистрация: 16.10.2015
Сообщений: 64
21.10.2016, 17:33  [ТС]
Цитата Сообщение от ilnurgi Посмотреть сообщение
и ещё, если я не ошибасюь, можно не хранить все в памяти а сразу наносить их в плот, если не ошибаюсь
Если вам известен раздел в доке матплотлиба(или любой другой источник) где об этом можно почитать - буду благодарен если скините ссылку на него.
Т.к. уже сказал что чтение на инглише мне пока дается не очень. )
(плохо понимаю пока что, как там вообще все взаимодействует в иерархии классов матплотлиба..)

Добавлено через 1 час 36 минут
Цитата Сообщение от ilnurgi Посмотреть сообщение
for line in open('C:/Users/Mike/Desktop/EURUSD.txt', 'r'):
А как тогда грамотно остановить считывание стоковых данных при достижении условия?
в моей же версии я переменную создал именно что бы потом к ней обратиться:
Python
1
open_text.close()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2016, 17:33
Помогаю со студенческими работами здесь

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

Ошибка при отображении таблицы
Разрабатывал сайт в другом месте, но когда пришел домой, появилась такая ошибка. По идеи под полями должна быть таблица с данными, взятыми...

Ошибка при отображении области
Когда ввожу координату, мне показывает неверную область, где появляется точка. Знатоки, помогите пожалуйста. clear all; close all; ...

Ошибка при отображении XML
Всем привет! Парсю XML документ с помощью js, в XML встречаются сущности - & на них парсер останавливается и дальше не идет, что...

Образ область при отображении
Подскажите, пожалуйста, как будет выглядеть область W. {e}^{iz}\quad :\quad Z \rightarrow W \\Z = \left\{ z \quad : \quad 0 \leq...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru