[英]logarithmic scale in Python
我正在嘗試以對數標度(Y軸)繪制圖形,但是我需要在Y軸上顯示所有原始值。
我使用了代碼:
# -*- coding: utf-8 -*-
import math
import matplotlib.pyplot as plt
import matplotlib.dates as dates
from datetime import datetime, timedelta
import numpy as np
x = []
y = []
with open("dataset.csv") as f:
for l in f:
X,Y = l.split(",") #separador eh a virgula
x.append(float(X))
y.append( float (Y))
#y.append( math.log (float (Y)))
#x1 = [datetime.fromtimestamp(int(d)) for d in x]
x1 = [str(datetime.fromtimestamp(int(d)))[-8:] for d in x]
y_pos = [idx for idx, i in enumerate(y)]
plt.figure(figsize=(17,9))
plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%m/%d/%Y %H:%M:%S'))
plt.bar(y_pos, y, align='edge', color="blue", alpha=0.5, width=0.5) # <--- EDICAO PRINCIPAL
plt.title("Values X Time")
plt.ylabel("Values")
plt.xlabel('Time')
plt.xticks(y_pos, x1, size='small',rotation=35, ha="right")
#plt.yticks(y)
#plt.yticks(np.arange(0,max(y),0.3))
#plt.yticks(np.arange(0,max(y)+5,1))
plt.yscale('log')
plt.ylim(ymax=sorted(y)[-1]+1) # valor maximo do eixo y
#plt.ylim(ymin=sorted(y)[0]-1) # valor minimo do eixo y
plt.show()
數據集在哪里:
1491828000,3
1491828060,195
1491828120,220
1491828180,240
1491828240,230
1491828300,238
1491828360,310
1491828420,280
1491828480,263
1491828540,271
1491828600,282
1491828660,302
1491828720,298
1491828780,257
1491828840,245
1491828900,200
1491828960,170
1491829020,138
1491829080,59
1491829140,39
1491829200,48
1491829260,95
1491829320,151
1491829380,155
1491829440,175
1491829500,93
1491829560,25
1491829620,3
1491829680,185
1491829740,233
1491829800,210
1491829860,86
1491829920,32
1491829980,46
1491830040,51
1491830100,201
1491830160,129
1491830220,116
1491830280,105
1491830340,200
1491830400,203
但是結果是:
如何在Y軸(對數標度)上顯示原始值,而不是10、10²等? 我盡力了,但在Y軸上只能顯示10、10²!
我需要在Y軸上顯示所有原始值。 任何想法?
問題似乎是如何給出所有y值,這些值在y軸上以條形表示,假設y軸是對數刻度。
盡管這可能沒有太大意義,但由於標簽重疊,這是答案:
您可以使用一個FixedLocator
設置標簽和a的位置ScalarFormatter
的格式設置為正常的十進制數(而不是10次冪)。
plt.gca().yaxis.set_major_locator(matplotlib.ticker.FixedLocator(np.unique(y))) plt.gca().yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
完整的代碼:
import matplotlib.pyplot as plt
import matplotlib.dates as dates
import matplotlib.ticker
from datetime import datetime, timedelta
import numpy as np
x,y = np.loadtxt(io.StringIO(u), delimiter=",", unpack=True)
x1 = [str(datetime.fromtimestamp(int(d)))[-8:] for d in x]
y_pos = [idx for idx, i in enumerate(y)]
plt.figure(figsize=(17,9))
plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%m/%d/%Y %H:%M:%S'))
plt.bar(y_pos, y, align='edge', color="blue", alpha=0.5, width=0.5)
plt.title("Values X Time")
plt.ylabel("Values")
plt.xlabel('Time')
plt.xticks(y_pos, x1, size='small',rotation=35, ha="right")
plt.yscale('log')
plt.ylim(ymax=sorted(y)[-1]+1) # valor maximo do eixo y
plt.gca().yaxis.set_major_locator(matplotlib.ticker.FixedLocator(np.unique(y)))
plt.gca().yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.show()
Matplotlib代碼格式是您要尋找的內容:
from matplotlib.ticker import FormatStrFormatter
...
plt.yscale('log')
plt.gca().yaxis.set_major_formatter(FormatStrFormatter('%.d')) #Here!
plt.ylim(ymax=sorted(y)[-1]+1) # valor maximo do eixo y
plt.show()
盡管可能有一種更簡單的方法。 使用Matplotlibs刻度格式文檔找到
您可以指定以太幣的x或y刻度位置。 要將最大值添加到y軸,請使用.yticks()
。
plt.yscale('log')
plt.yticks([1,10,100] + [max(y)])
plt.gca().yaxis.set_major_formatter(FormatStrFormatter('%.d'))
確定運行時對數刻度的主要刻度; 在數據中找到10的最大冪,然后將10的所有冪置於其之下:
import math
...
exp = int(math.log10(max(y)))
majors = [10**x for x in range(exp+1)]
#majors = [10**n for n in range(len(str(max(y))))]
plt.yticks(majors + [max(y)])
除了ImportanceOfBeingErnest的答案外,您還可以添加
plt.gca().minorticks_off()
刪除對數刻度的小刻度,因為它們是重疊的。 由於我相信這可以消除所有較小的滴答聲,因此您可以使用另一種方法:
matplotlib.rcParams['xtick.minor.size'] = 0
matplotlib.rcParams['xtick.minor.width'] = 0
或此問題中提到的任何其他解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.