(pyqtgraph)如何在对数Y轴上显示实际(非科学)刻度值?

时间:2018-03-27 03:50:24

标签: python pyqt5 subclass logarithm pyqtgraph

我的第一个StackOverflow问题,对于格式不佳或者之前已经问过这个问题表示道歉(我无法在任何地方找到答案)。我正在使用Python 3和pyqtgraph。

我想在对数y刻度上绘制(价格)数据,但我想保留实际值,不是科学记数法

import pyqtgraph as pg
from pyqtgraph.Qt import QtGui

pg.mkQApp()

pw = pg.PlotWidget()
pw.show()

myplot = pg.PlotDataItem([1,2,4,8,16,32,64,128])

p1 = pw.plotItem
p1.hideAxis('left')
p1.showAxis('right')
p1.showGrid(y = True, alpha = 1.0)
p1.addItem(myplot)
p1.setLogMode(y=True)

QtGui.QApplication.instance().exec_()

myplot是logMode中的直线,但刻度值是科学的: myplot with logscale

我从相关问题(PyQtgraph y axis label non scientific notation)修改了一个子类,并试图覆盖AxisItem,但它似乎没有通过myplot“激活”。 :

import pyqtgraph as pg
from pyqtgraph.Qt import QtGui

class NonScientific(pg.AxisItem):
    def __init__(self, *args, **kwargs):
        super(NonScientific, self).__init__(*args, **kwargs)

    def tickStrings(self, values, scale, spacing):
        return [int(value*1) for value in values] #This line return the NonScientific notation value

    def logTickStrings(self, values, scale, spacing):
        return [int(value*1) for value in values] #This line return the NonScientific notation value

pg.mkQApp()

pw = pg.PlotWidget()
pw.show()

myplot = pg.PlotDataItem([1,2,4,8,16,32,64,128], axisItems={'right': NonScientific(orientation='right')})

p1 = pw.plotItem
p1.hideAxis('left')
p1.showAxis('right')
p1.showGrid(y = True, alpha = 1.0)
p1.addItem(myplot)
p1.setLogMode(y=True)

QtGui.QApplication.instance().exec_()

我的问题是:

  • 我是否正确覆盖了子类? AxisItem甚至是正确的类来覆盖?如果是这样,有没有办法“获取”p1 plotItem的AxisItem?我试过p1.getAxis('right')但不知道如何以这种方式覆盖类
  • 有没有办法在日志范围内沿y轴保留实际,而不是简单地修改字符串,而不转换为日志数字?

问题2的意思是,我尝试过一种可能错误的解决方法。我在结尾前添加了这些行:

yaxticks = [[(1, '1.00'), (2, '2.00'), (4, '4.00'), (8, '8.00'), (16, '16.00'), (32, '32.00'), (64, '64.00'), (128, '128.00')]]
yax = p1.getAxis('right')
yax.setTicks(yaxticks)

还试过这个:

yaxticks = [[(0.1, '1.00'), (0.2, '2.00'), (0.4, '4.00'), (0.8, '8.00'), (1.6, '16.00'), (3.2, '32.00'), (6.4, '64.00'), (12.8, '128.00')]]

与原始结果相比,结果如下: 3 tries with logScale

根据这些线的下降位置,我可以告诉我可以通过参考每个点的日志值来实现这一点,但这似乎是单声道的并且是一个创可贴解决方案。我的应用程序与价格数据密切配合,我担心所有参考价格数据的图形函数都需要转换为日志值。

有更好的方法吗?

0 个答案:

没有答案