Matplotlib, как построить график с логарифмическими шкалами, и не логарифмическими подписями?
Пытаюсь подружится с matplotlib. Как построить график я понял, но не могу нормально заставить рисовать логарифмическую шкалу с не логарифмическими метками. Во первых логарифмические метки, накладываются на нормальные, во вторых, не могу задать начальные координаты, что бы на график по оси у строился от 0.
import matplotlib.pyplot as plt
from matplotlib import ticker
x_data = [3, 6, 100, 200, 300, 600]
y_data = [47, 48, 62, 72, 81, 100]
x_label = ['3', '6', '100', '200', '300', '600']
y_label = ['47', '48', '62', '72', '81', '100']
_, ax = plt.subplots(figsize=(10,4))
ax.plot(x_data, y_data, color='#539caf', alpha=1)
ax.set_title('График')
ax.set_xlabel('prm')
ax.set_ylabel('углы')
ax.set_yscale('log')
ax.set_xscale('log')
# данные для построения
ax.set_xticks(x_data)
ax.set_yticks(y_data)
# подписи осей
ax.set_xticklabels(x_label)
ax.set_yticklabels(y_label)
# лимит построения - не работает, график уплывает
# он строит по линейной шкале, а в логарифмической не может
# ax.set_xlim(1,1000)
# ax.set_xlim(1,1000)
# Второй вариант
# plt.xscale('log')
# plt.yscale('log')
# plt.yticks(y_data, y_label)
# plt.xticks(x_data, x_label)
ax.grid(True)
plt.show()
Ну и когда устанавливаю лимит в 1000 делений по оси х и у, график уплывает. А так должно выглядеть:
Ответы (1 шт):
Автор решения: Dima
→ Ссылка
import matplotlib.pyplot as plt
from collections import OrderedDict
import math
def logplot(data, title = 'Graph'):
x_data = []
y_data = []
# сортируем словарь в обратном порядке
sorted_dict = OrderedDict(sorted(data.items(), key=lambda x: x[1]))
# Создаём кортеж для данных и кортеж для обозначений
for x in sorted_dict:
x_data.append(int(x))
# Создаём кортеж для данных и кортеж для обозначений
for x in sorted_dict:
y_data.append(sorted_dict[x])
# x_data = [3, 6, 100, 200, 300, 600]
# y_data = [47, 48, 62, 72, 81, 100]
x_lable = [1, 3, 6, 10, 100, 200, 300, 600, 1000]
y_lable = [1, 3, 5, 10, 50, 100, 150, 200, 1000]
_, 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)
# н знаю почему, но как говорится, без этого не работает
plt.xticks(x_lable)
plt.yticks(y_lable)
#
# # axis signatures
ax.set_xticklabels(x_lable)
ax.set_yticklabels(y_lable)
# добавляем подписи к маркерам
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')
# Вспомогатtльные линии
# ax.grid(True, which='major', color='#616161', linestyle='-', alpha=0.5)
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()
Реализация так себе, но другого не придумал и удовлетворяет мои задачи
Как результат:

