Matplotlib: как заставить появляться и увеличивать размер второстепенных и основных тиков на оси x логарифмической шкалы

Я работаю над графиком данных (logscale, symlog). Мне трудно сделать так, чтобы по оси x (логарифмическая шкала) отображались второстепенные галочки с видимой высотой и шириной.

По оси x у меня есть значения, начинающиеся с 1e-8 до 1. В начале, по неизвестной мне причине, у меня был только интервал «2 степени 10», т.е. я попадал на график x_axis значения майоров, как это:

[1e-8, 1e-6, 1e-4, 1e-2, 1]

Я исправил это, выполнив явно:

  # Important otherwise missing ticks
  plt.xticks([1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1])

Итак, теперь у меня есть следующая цифра:

Отсутствуют второстепенные тики для логарифмической шкалы оси X

Как видите, второстепенные отметки для каждой степени 10 отсутствуют, и я не знаю, как их отобразить, даже если между каждой степенью 10 не так много места.

Вот код, который я использую для создания этой фигуры:

# Modules import
import sys
import numpy as np
import scipy.integrate as pyint
import os
from os import path
import glob
import scipy
import re
import shutil
import matplotlib.pyplot as plt 
from matplotlib import ticker

# Initialize figure
fig = plt.figure(num=None, figsize=(12, 12), facecolor='w', edgecolor='k')
fig.patch.set_facecolor('white')
fig.patch.set_alpha(1)

# Control on graphic
ax = plt.gca()

# Increase space between x-axis and x-label
ax.tick_params(axis = 'x', which = 'major', pad = 15)

# Lebels on axis
plt.xlabel('Step $\Omega_{m}$', fontsize = 20)
plt.ylabel('$C_{\ell}^{\'}$($\Omega_{m}$) relative', fontsize = 20)
plt.xticks(fontsize = 20)
plt.yticks(fontsize = 20)
plt.xscale('log')
plt.grid()

# Important otherwise missing ticks
plt.xticks([1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1])

# Title : different multipoles
string_intel = '(CAMB-0.1.7) - '+type_GG_LL_GL+' - $C_{\ell}^{\'}$ relative of '+paramLatexArray[idParam]+'('+str(der)+' pts) at $z$ = '+str(zrange[idRedshift])+' - '+str(numel)+' pts'
plt.title(string_intel, fontsize = 20, pad = 25)

colorSimplePlot = ['b', 'r', 'g', 'k', 'y', 'm', 'c']

# Plot command 
for idMultipole in range(len(multipole)):
  plt.plot(stepNewArray[:], eval('matrixCl_der_'+str(der)+'[:, idMultipole, idParam, lx, ly]'), colorSimplePlot[idMultipole])

# Chose if negative or positive derivatives
# Plot with symlog or log along y-axis
# 1) For example : GG at z = 2.038 and l = 366
#    needs symlog with lintreshy = 1e-9
# 2) For example : LL at z = 2.038 and l = 366
#    needs nothing (even no log)
if (type_GG_LL_GL == 'GG'):
  plt.yscale('symlog', linthreshy = 1e-9)
elif (type_GG_LL_GL == 'LL'):
  plt.yscale('linear')

# Legend
plt.legend(['$l = 366.42$', '$l = 1079.28$', '$l = 1792.14$', '$l = 2505$',\
        '$l = 3217.85$', '$l = 3930.71$', '$l = 4643.57$'], fontsize=15, loc='best')

# Save plot
plt.savefig('Cl_derivative_Omega_m.pdf')

Кто-нибудь может увидеть, что мне нужно сделать, чтобы отобразить второстепенные xticks для каждого интервала логарифмической шкалы оси x?

Я также попытался добавить:

from matplotlib import ticker
from matplotlib.ticker import LogLocator

ax.tick_params(axis = 'x', which = 'major', pad = 15)
ax.xaxis.set_major_locator(LogLocator(base=10))
ax.xaxis.set_major_locator(LogLocator(base=10, subs=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]))

Но это не работает...

Во второй раз я хотел бы также контролировать размер этих второстепенных галочек.

Благодаря @Quand Huang мне удалось сделать следующую фигуру:

отображается второстепенный

Вы можете заметить, что основные тики исчезли, а также команда сетки, т.е. выполнив в моем фрагменте кода:

  minors = (0.1**np.arange(9)[:,None] * np.arange(0.1,1,0.1)).ravel()
  plt.yticks(fontsize = 20)
  plt.xscale('log')
  # Important otherwise missing ticks
  plt.xticks([1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1], fontsize = 40)
  plt.xticks(minors, fontsize = 20)
  plt.grid()

Я попытался установить крупный шрифт для основных галочек вручную (fontsize = 40), но он не отображается. Кстати, а почему пропал режим grid?


person youpilat13    schedule 01.06.2020    source источник


Ответы (1)


Вы можете генерировать второстепенные тики следующим образом:

minors = (0.1**np.arange(9)[:,None] * np.arange(0.1,1,0.1)).ravel()

plt.xscale('log')
plt.xticks(minors);

Выход:

введите здесь описание изображения

person Quang Hoang    schedule 01.06.2020
comment
.Спасибо за быстрый ответ, это мне очень помогает. А как насчет контроля размера этих мелких галочек. Действительно, я хотел бы увеличить их высоту и уменьшить ширину? - person youpilat13; 01.06.2020