Я работаю над графиком данных (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])
Итак, теперь у меня есть следующая цифра:
Как видите, второстепенные отметки для каждой степени 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
?