Matplotlib: как сделать появление и увеличение размера второстепенных и основных делений на оси X logscale
Я работаю над графиком данных (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
режим исчезнет?
1 ответ
Вы можете сгенерировать второстепенные тики следующим образом:
minors = (0.1**np.arange(9)[:,None] * np.arange(0.1,1,0.1)).ravel()
plt.xscale('log')
plt.xticks(minors);
Выход: