Python: полулогекс, включая 0 - PullRequest
       41

Python: полулогекс, включая 0

1 голос
/ 01 августа 2020

Я пытаюсь воспроизвести этот график, в частности ось абсцисс в логарифмической шкале:

enter image description here

The main objective is for me to be able to display the x-axis as equally spaced log-scale.

I am currently using semilogx from matplotlib, however this does not include 0 (of course, log(0) would be undefined). However, I have a data point at 0, and need to display it. As it is, my code looks like this:

dt = 0.01 
t = np.arange(0, 1, 0.1)
x = [0, 10**-6, 10**-5, 10**-4, 10**-3, 10**-2, 1]
dfy = list(averages.iloc[0, :]) # where averages is a row with 7 entries
plt.plot(x, dfy, marker = 'o', linestyle = '')  # plots graph
plt.semilogx(t, np.exp(-t/5.0), linestyle = '') 

The graph produced looks like this, which I am happy with except for the missing 0:

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

Я пробовал:

plt.xscale('symlog')
plt.xscale('log')

Однако это не дает необходимой равномерно распределенной шкалы журнала. Кроме того, я попытался использовать вместо 0, 10 ^ -16, но это включает только все степени от -6 до -16. Мне нужно go от 0, а затем сразу до 10 ^ -6.

Любые советы приветствуются. Заранее спасибо.

1 Ответ

1 голос
/ 01 августа 2020

Это непростой вопрос, и его отличительной чертой является тот факт, что symlog, он же SymmetricalLogScale, имеет аргумент linthresh, который указывает область около нуля, где x-домен рассматривается как линейный, чтобы избежать log(x) уходя в бесконечность. Проблема в вашем случае заключается в том, что значение по умолчанию для этого параметра - 2.0, следовательно, все между -2 и +2 здесь по умолчанию в линейном, не логарифмическом масштабе. Вы хотите указать 1e-7, то есть любое значение от нуля до следующего допустимого значения в домене.

Ссылки:

Документация (очень не хватает важная часть, в которой должно быть указано значение по умолчанию linthreshx): https://matplotlib.org/3.1.0/api/scale_api.html#matplotlib .scale.SymmetricalLogScale

Source (копайте глубже, чтобы найти строку linthresh = kwargs.pop('linthreshx', 2.0) что является вашим виновником): https://matplotlib.org/3.1.0/_modules/matplotlib/scale.html#SymmetricalLogScale

Этот ответ также очень полезен в целом при работе с логарифмическими c осями.

Ссылаясь на все это, должно быть очевидно, что вы должны сделать следующее:

plt.xscale('symlog', linthresh=1e-7)

Я считаю, что это даст вам хорошо линеаризованные логарифмические декады И нулевое значение x-области.

NB: 1e-7 широко предпочтительнее более громоздких 10**-7 и др.

PS linthreshx даст вам DeprecationWarning в matplotlib 3.3.0 потому что будущее linthresh.

...