Matplotlib log-log plot - показывать только степени десяти на оси y - PullRequest
0 голосов
/ 04 апреля 2020

Предположим, у меня есть следующий код:

import matplotlib as mpl
from matplotlib import pyplot as plt
x =[10, 14, 19, 26, 36, 50, 70, 98, 137, 191, 267, 373, 522, 730, 1021, 1429, 2000, 2800, 3919, 5486, 7680] 
y = [ 0.0085,  0.006900000000000001,  0.007600000000000001,  0.007600000000000001,  0.01,  0.008700000000000003,  0.0094,  0.008800000000000002,  0.0092,  0.009,  0.009999999999999998,  0.010099999999999998,  0.010899999999999998,  0.010899999999999998, 0.011,  0.0115,   0.0115,  0.0118,  0.013000000000000001,  0.0129, 0.0131]
fig, ax1 = plt.subplots() 
ax1.plot(x,y,linewidth=1) 
ax1.set_xscale('log') 
ax1.set_yscale('log') 
plt.show()

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

enter image description here

Что я хочу сделать, чтобы удалить тики на оси Y, которые не степени 10. В этом конкретном примере, удалите 9x10 ^ -3, 8x10 ^ -3 et c. и оставьте только 10 ^ -2.

Я пробовал некоторые другие предложения, например этот , но ни одно из них не сработало .. Есть идеи?

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете найти все степени 10 между вашими минимальными и максимальными значениями y, а затем установить тики непосредственно с помощью ax1.set_yticks( y_ticks).

import matplotlib as mpl
from matplotlib import pyplot as plt
import math 

x =[10, 14, 19, 26, 36, 50, 70, 98, 137, 191, 267, 373, 522, 730, 1021, 1429, 2000, 2800, 3919, 5486, 7680] 
y = [ 0.0085,  0.006900000000000001,  0.007600000000000001,  0.007600000000000001,  0.01,  0.008700000000000003,  0.0094,  0.008800000000000002,  0.0092,  0.009,  0.009999999999999998,  0.010099999999999998,  0.010899999999999998,  0.010899999999999998, 0.011,  0.0115,   0.0115,  0.0118,  0.013000000000000001,  0.0129, 0.0131]
fig, ax1 = plt.subplots() 
ax1.plot(x,y,linewidth=1) 
ax1.set_xscale('log') 
ax1.set_yscale('log')

ymin_pow = math.floor(math.log10(min(y)))
ymax_pow = math.ceil(math.log10(max(y)))

y_ticks = [10**i for i in range(ymin_pow, ymax_pow + 1)]

# optional: bound the limits 
if y_ticks[0] < min(y):
    y_ticks = y_ticks[1:]
if y_ticks[-1] > max(y):
    y_ticks = y_ticks[-1:]

ax1.set_yticks(y_ticks, [str(i) for i in y_ticks])

# un-comment out the following line to have your labels 
# not in scientific notation
# ax1.get_yaxis().set_major_formatter(mpl.ticker.ScalarFormatter())

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...