-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplot.py
122 lines (93 loc) · 4.27 KB
/
plot.py
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from matplotlib import ticker
from collections import OrderedDict
import math
import const
def logplot(data, title = 'Graph', dict = 'default'):
'''
logplot - расчитана на работу с 6 скоростями вискозиметров на подобие Fann 800
Скорости идут от большего к меньшему
:param data: - на вход принимает словарь вида {'скорость':'показатель шкалы'}
скорости идут от большего к меньшему (600 -> 3)
:param title: - название реологической модели
:param dict: - 'defoult' or 'castum'
'defoult' - стандартный набор скоростей
'castum' - пользовательский набор скоростей
:return: - ничего не возвращает, жадная функция
'''
x_data = []
y_data = []
if dict is 'defoult':
x_data = const.x_data
for i in x_data:
y_data.append(data[str(i)])
elif dict is 'castum':
'''
И так, если ты, друг мой, решл(а) пойти по сложному пути и использовать свой набор значений
то вот что будет дальше, сначала функция переберёт словарь, найдёт первое значение и последнее
значение скорости. Если первая будет больше последней, то отсортирует словарь в обратном порядке
что бы на графике, скорости росли, с лева, на право.
'''
n, first_el, last_el = 0, 0, 0
for i in data:
if n == 0:
first_el = i
elif n == len(data):
last_el = i
n += 1
if int(first_el) > int(last_el):
# сортируем словарь в обратном порядке
data = OrderedDict(sorted(data.items(), key=lambda x: x[1]))
# Создаём кортеж для данных и кортеж для обозначений
for x in data:
x_data.append(int(x))
# Создаём кортеж для данных и кортеж для обозначений
for x in data:
y_data.append(data[x])
else:
print(f'\nНеверный формат входящих данных \n{data}')
_, ax = plt.subplots(figsize=(9, 5))
ax.plot(x_data,
y_data,
color='#200094',
alpha=1,
marker='o',
markerfacecolor="#ff22aa")
# задний фон
rect = ax.patch
rect.set_facecolor('#bbbabf')
rect.set_alpha(0.25)
ax.set_title(title)
ax.set_xlabel('prm')
ax.set_ylabel('angles')
plt.yscale('log')
plt.xscale('log')
ax.set_xlim(1, 1000)
ax.set_ylim(1, 1000)
# Преобразует значения подписей шкал из логарифмических, в нелогарфифмические
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter("%d"))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d"))
# добавляем подписи к маркерам
for i in range(len(y_data)):
x = x_data[i]
# тупо что бы было красиво
if y_data[i] in ('0', '1'):
add = 1
elif y_data[i] < 10:
add = math.ceil(math.log(y_data[i], 10)) * 2
elif y_data[i] >= 10:
add = math.ceil(math.log(y_data[i], 10)) * 5
y = y_data[i] + add
# отвечает за рисунок
ax.text(x, y, str(y_data[i]), color='r')
# Основные линии
ax.grid(True, which='major', color='black', linestyle='-', alpha=0.5)
# Вспомогатльные линии
ax.grid(True, which='minor', color='#616161', linestyle='dashed', alpha=0.5)
plt.show()
if __name__ == '__main__':
_fann = {'600': 100, '300': 81, '200': 72,
'100': 62, '6': 48, '3': 47}
logplot(_fann)