Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 494
1

Некорректное построение графиков: matplotlib

25.10.2020, 01:15. Показов 3798. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Почему в matplotlib график (прямые линии) строятся не совсем от заданных координат по оси абцисс?


Там какие-то смещения и в глаза это бросается резко. Значения все проверены. Всё верно.

Как с этим бороться, неужели набивать значения повыше?
Миниатюры
Некорректное построение графиков: matplotlib  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2020, 01:15
Ответы с готовыми решениями:

При построении 2х графиков накладывается ylabel и title в Matplotlib
Добрый день! Буду краток, всё будет видно из примера. Недавно из Matlab начал, строить графики...

Matplotlib построение изолиний по своим данным
Обычно изолинии(в Matplotlib) строятся по функции от X и Y Но мне надо построить по своим данным....

Pandas построение графиков
У меня есть DataFrame. В нём есть колонки, time и some_data. Можно ведь как-то создать график ,...

Построение графиков функций на языке Python с использованием модуля SymPy
Не могли бы вы скинуть мне примеры построения графиков функций на Python'е c использованием модуля...

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

6
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 494
25.10.2020, 01:18  [ТС] 2
И причём, чем толще линия, тем сильнее смещение
0
578 / 411 / 68
Регистрация: 09.01.2018
Сообщений: 1,361
25.10.2020, 12:03 3
Приведите свой код и данные (хотя-бы часть, которая по вашему мнению рисуется "неверно").
1
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 494
25.10.2020, 14:19  [ТС] 4
Цитата Сообщение от passant Посмотреть сообщение
Приведите свой код и данные (хотя-бы часть, которая по вашему мнению рисуется "неверно").

у меня 2 объекта оси, на одной рисуется вот эта синяя вертикальная линия, на другой графики красным.

Для той оси, которая рисует синюю линию заданы границы:

Python
1
ax2.set_xlim(0, x_end)
Задал границы для второй оси:

Python
1
ax.set_xlim(0, x_end)
Всё хорошо.

вот код:

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
import matplotlib.pyplot as plt
 
fig, ax = plt.subplots()
    
    
 
ax2 = ax.twiny()
 
count_max = 0
    
 
x_vals = []
labels = []
 
data =  [[(139.35, 456), (139.34, 200), (139.33, 63), (139.31, 81), (139.3, 8147), (139.29, 3858), (139.28, 5626), (139.27, 83), (139.26, 192), (139.25, 2), (139.24, 9), (139.23, 503)], [(139.29, 6229)]]
 
 
for bunch in data:
     next_c = get_max_count(bunch)# здесь я получаю макс. элемент по второму элементу из всех кортежей в списке bunch
     labels.append(str(crr))# объект datetime.time его взятие опущено из кода
 
 
      for cost, count in bunch:
            xs = [count_max, count_max+count]
            ys = [cost]*2
            ax.plot(xs, ys, 'r', linewidth=4)
        
        
     ax.set_xlim(0, count_max+next_c)
        
     x_vals.append(count_max)
     ax2.set_xlim(0, count_max + next_c)
            
     ax2.set_xticks(x_vals)
     ax2.set_xticklabels(labels)
 
     count_max += next_c
 
for xc in x_vals[1:]:
        plt.axvline(x = xc, linewidth=1)
plt.show()
И всё равно, с такими толщинами линий (если они разные по толщине), то они залезают за границы, которые тоньше. Вот вертикальная синяя линия построена при x= 8147 и координаты красной линии при y= 139.29 (это прерывистый график) по оси абцисс: (8147, 14376) для линии при y = 139.30 --- (0, 8147), но они залезают за эту синюю линию.

Если сделать толщины линий одинаковые, то залезания нет.
Миниатюры
Некорректное построение графиков: matplotlib  
0
578 / 411 / 68
Регистрация: 09.01.2018
Сообщений: 1,361
25.10.2020, 17:42 5
Поставьте параметр linewidth=1, если вам нужна такая графическая точность.
0
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 494
25.10.2020, 18:07  [ТС] 6
Цитата Сообщение от passant Посмотреть сообщение
Поставьте параметр linewidth=1, если вам нужна такая графическая точность.
Да, я знаю, что если у линий будет одинаковая толщина, то проблема исчезнет. Но в ином случае, кроме как чуть удлинить или укоротить линии проблему не решить. Пока только такой рецепт, если у линий достаточная длина:

Python
1
2
3
4
 if count > 200:
                xs = [count_max+100, count_max+count-100]
 else:
                xs = [count_max, count_max+count]
0
578 / 411 / 68
Регистрация: 09.01.2018
Сообщений: 1,361
25.10.2020, 19:29 7
Понять, что происходит можно, нарисовав scatter-график и там поигравшись с размером точки. Точка всегда рисуется так, что-бы ее центр совпадал с точной координатой, а если вам надо не точка, а кружок - то его центр будет соответствовать данным, а вокруг будет закрашенная область заданного (произвольно) радиуса. И это абсолютно логично при анализе данных.
То-же самое происходит, когда рисуем plot-график.

Поэтому вам надо решить, что вам надо. Если надо обязательно точно отрисовывать график - то понятно, что ширина линии должна быть минимальной, т.е. 1 пиксель. И тогда никто никуда не смещается, за линии не заходит и т.д.
Если ваша задача сделать красивый график, эстетически грамотно выверив ширину столбиков и пр. с игнорированием точности - ну тогда да, придется изощряться. Но вообще говоря, Matplotlib создан не для этих целей.
0
25.10.2020, 19:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2020, 19:29
Помогаю со студенческими работами здесь

Отрисовка графиков библиотекой matplotlib
Категорически приветствую всех форумчан! Проблема следующего характера: пишу на малине программу...

Matplotlib сетка графиков точечных диаграм по двум столбцам
Создаю с помощью matplotlib сетку графиков точечных диаграм по двум столбцам. Не могу понять логику...

[matplotlib] Разработка программ для построения графиков функции
Разработка программ для построение графиков функции Нужно использовать библbотеку matplotlib

Построение поверхности с matplotlib
Нужно создать поверхность с каноническим уравнением a*sin(x)-b*cos(y)=z; коэфициентами а=1, b=2; и...

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

Matplotlib построение изолиний
В общем нужно мне по исходным данным построить изолинии, для этого использую методы из библиотеки...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru