Как я могу использовать matplotlib ticklabel_format, чтобы не использовать нотацию scientifi c на метках оси y - PullRequest
0 голосов
/ 25 марта 2020

Я создаю график (на листе с колабом) и хочу, чтобы на ярлыках y-тика не использовалась научная нотация c. Ticklabel_format не имеет никакого значения для окончательного графика. Метки оси y по-прежнему отображаются как 10 ^ 3 вместо 1000. Как отформатировать метки y, чтобы не использовать нотацию scientifi c? Вот мой код

import matplotlib.pyplot as plt
plt.ticklabel_format(style='plain', axis='y')
plt.plot(Cd_rank,Cd_raw,linewidth=4)
plt.plot(Cd_rank,Cd_sed,linewidth=4)
plt.plot(Cd_rank,Cd_filter,linewidth=4)
plt.plot([0,1],[0.3,0.3],linewidth=4)
plt.plot([0,1],[5,5],linewidth=4)
plt.ylabel('Turbidez (UTN)')
plt.xlabel('Datos ordenados')
plt.yscale('log')
plt.legend(['Agua cruda','Decantada','Filtrada','Norma EPA','Norma ENACAL'])

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

ScalarFormatter показывает метки в формате по умолчанию. Обратите внимание, что в зависимости от конкретной ситуации, matplotlib по-прежнему может использовать научную нотацию c:

  • Когда числа слишком велики (по умолчанию это около 4 цифр). set_powerlimits((n, m)) может использоваться для изменения пределов.

  • Если числа очень близки друг к другу, matplotlib описывает диапазон, используя смещение. Это смещение находится в верхней части оси. Это можно подавить с помощью параметра useOffset=None форматера.

  • В некоторых случаях с логарифмической шкалой c основных тиков очень мало. Тогда также некоторые (но не все) мелкие галочки получают ярлык. Также для них, форматер может быть изменен. Проблема может заключаться в том, что простой ScalarFormatter установит слишком много меток. Либо подавьте все эти второстепенные метки, используя NullFormatter, либо вам понадобится очень специальный форматировщик, который возвращает пустые строки для меток второстепенных тиков, которые необходимо подавить.

Простой пример :

from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np

N = 50
Cd_rank = np.linspace(0, 100, N)
Cd_raw = np.random.normal(1, 20, N).cumsum() + 100

plt.plot(Cd_rank, Cd_raw, linewidth=4)
plt.plot([0, 1], [0.3, 0.3], linewidth=4)
plt.plot([0, 1], [5, 5], linewidth=4)
plt.yscale('log')
plt.gca().yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.gca().yaxis.set_minor_formatter(ticker.NullFormatter())
plt.show()

А вот более сложный пример с младшими (зелеными) и крупными (красными) галочками.

from matplotlib import pyplot as plt
from  matplotlib import ticker
import numpy as np

N = 50
Cd_rank = np.linspace(0, 100, N)
Cd_raw = np.random.normal(10, 5, N).cumsum() + 80

plt.plot(Cd_rank, Cd_raw, linewidth=4)
plt.yscale('log')
mticker = ticker.ScalarFormatter(useOffset=False)
mticker.set_powerlimits((-6, 6))
ax = plt.gca()
ax.yaxis.set_major_formatter(mticker)
ax.yaxis.set_minor_formatter(mticker)
ax.tick_params(axis='y', which='major', colors='crimson')
ax.tick_params(axis='y', which='minor', colors='seagreen')
plt.show()

sample plot

PS: Когда в тиках участвуют обе степени: 10 больше 1 и меньше 1 (например, 100, 10, 1, 0.1, 0.01), ScalarFormatter не отображает числа меньше 1 (отображает 0.1 и 0.01 как 0). В этом случае вместо него можно использовать StrMethodFormatter:

plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter("{x}"))
0 голосов
/ 25 марта 2020

Вот код, который отключает научную нотацию c и правильно обрабатывает числа, которые меньше 1. Спасибо @ Johan c за этот код.

from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np

N = 50
x = np.linspace(0,1,N)
y = np.logspace(-3, 2, N)

plt.plot(x, y, linewidth=4)
plt.yscale('log')
plt.ylim(bottom=0.001,top=100)
plt.gca().yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter("{x}"))
plt.show()```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...