Python中的对数标度 [英] logarithmic scale in Python
问题描述
我正在尝试以对数标度(Y轴)绘制图形,但是我需要在Y轴上全部显示原始值.
I am Trying to plot a graphic in logarithmic scale (Y axis) but I need to show in the Y axis all the original values.
我使用了代码:
# -*- 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²!
How could I show the original values in Y axis (logarithmic scale ), instead of 10, 10², etc? I tried hard but I only could show 10, 10² in Y axis!
我需要在Y轴上全部显示原始值. 有什么主意吗?
I need to show in the Y axis all the original values. Any idea?
推荐答案
您可以指定x或y刻度位置.要将最大值添加到y轴,请使用 .yticks()
.
You can specify ether the x or y tick locations. To add the maximum value to the y axis use .yticks()
.
plt.yscale('log')
plt.yticks([1,10,100] + [max(y)])
plt.gca().yaxis.set_major_formatter(FormatStrFormatter('%.d'))
确定运行时对数刻度的主要刻度;在数据中找到10的最大幂,然后 make 在其下方的10的所有幂.
To determine the major ticks for a log scale at runtime; find the maximum power of ten in the data, then make all the powers of ten below it.:
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)])
这篇关于Python中的对数标度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!