1

Chaco 中的小记号总是被省略: 在此处输入图像描述

这并不总是方便的。是否有可能像 matplotlib 中那样在 Chaco 中出现小刻度:

在此处输入图像描述

没有找到任何相关的..谢谢。

4

1 回答 1

1

编辑:此功能现已添加到 Chaco 4.6,因此如果您使用此版本或更高版本,请使用以下类似代码。如果没有看到下面的原帖。另请参阅此处的文档和此处的另一个示例。

if __name__ == "__main__":
    from traits.etsconfig.api import ETSConfig
    ETSConfig.toolkit = 'qt4'
    #
    import warnings
    warnings.filterwarnings(action = "ignore", category = FutureWarning, module="chaco")
    warnings.filterwarnings(action = "ignore", category = FutureWarning, module="traits")
#
from PySide import QtGui, QtCore
import numpy as np
from enable.api import Component, Container, Window
from chaco.api import *
import sys
#
class ChacoPlot(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ChacoPlot, self).__init__(parent)
        #
        self.container = OverlayPlotContainer(padding=40)
        #
        self.enableWindow = Window(self, -1, component=self.container)
        windowLayout = QtGui.QVBoxLayout(self)
        windowLayout.addWidget(self.enableWindow.control)
        #
        self.xRange = DataRange1D()
        self.yRange = DataRange1D()
        #
        self.xMapper = LinearMapper(range=self.xRange)
        self.yMapper = LinearMapper(range=self.yRange)
        #
        self.plots = {}
        # keep a list of plots added to the container
    #
    def setMinimumSize(self, width, height):
        self.enableWindow.control.setMinimumSize(width, height)
    #
    def addLine(self, name, plotType):
        xSource = ArrayDataSource([0])
        ySource = ArrayDataSource([0])
        #
        self.xRange.add(xSource)
        self.yRange.add(ySource)
        #
        index_mapper = self.xMapper
        value_mapper = self.yMapper
        #
        # plotType is a class name
        plot = plotType(    index = xSource,
                            value = ySource,
                            index_mapper = index_mapper,
                            value_mapper = value_mapper,
                            visible = False
                       )
        #
        self.container.add(plot)
        #
        self.plots[name] = {'plot':plot, 'xSource':xSource, 'ySource':ySource}
    #
    def updateLine(self, name, xData, yData):
        plot = self.plots[name]
        #
        if np.array(xData).size != 0:
            plot['plot'].visible = True
        else:
            plot['plot'].visible = False
            xData = [0]
            yData = [0]
        #
        plot['xSource'].set_data(xData)
        plot['ySource'].set_data(yData)
    #
    def addAxis(self, plotName, orientation):
        plot = self.plots[plotName]['plot']
        #
        if orientation == 'top' or orientation == 'bottom':
            mapper = self.xMapper
        if orientation == 'left' or orientation == 'right':
            mapper = self.yMapper
        #
        axis = PlotAxis(plot, orientation=orientation, mapper=mapper)
        plot.overlays.append(axis)
        #
        return axis
    #
    def addMinorAxis(self, plotName, orientation):
        plot = self.plots[plotName]['plot']
        #
        if orientation == 'top' or orientation == 'bottom':
            mapper = self.xMapper
            range = self.xRange
        if orientation == 'left' or orientation == 'right':
            mapper = self.yMapper
            range = self.yRange
        #
        newAxis = MinorPlotAxis(plot, orientation=orientation, mapper=mapper)
        plot.overlays.append(newAxis)
        #
        return axis
    #
#
if __name__ == "__main__":
    appQT = QtGui.QApplication.instance()
    #
    x1 = np.arange(300)/18.0
    y1 = np.sin(x1)
    x2 = np.arange(300)/18.0
    y2 = 2.0*np.cos(x2)
    #
    plot = ChacoPlot()
    plot.setMinimumSize(400,300)
    #
    plot.addLine('line1', LinePlot)
    plot.addLine('line2', LinePlot)
    plot.updateLine('line1', x1, y1)
    plot.updateLine('line2', x2, y2)
    #
    plot.addAxis('line1', 'bottom')
    plot.addAxis('line1', 'left')
    plot.addMinorAxis('line1', 'bottom')
    plot.addMinorAxis('line1', 'left')
    #
    plot.show()
    appQT.exec_()

原文: Chaco 没有专门有这个功能,但是你可以通过添加额外的PlotAxis. 您需要修改轴的一些属性:

  • tick_generator- 此对象定义刻度的位置
  • tick_label_formatter- 此函数返回给定刻度标签值的刻度标签字符串
  • tick_intick_out- 这些数字定义刻度的大小(进出轴)

这是一个例子。这是很多代码,但它相当简单。尽管人们通常使用Plot辅助类制作绘图,但我喜欢手动创建绘图,因为它更容易定制。无论如何希望它有所帮助。

if __name__ == "__main__":
    from traits.etsconfig.api import ETSConfig
    ETSConfig.toolkit = 'qt4'
    #
    import warnings
    warnings.filterwarnings(action = "ignore", category = FutureWarning, module="chaco")
    warnings.filterwarnings(action = "ignore", category = FutureWarning, module="traits")
#
from PySide import QtGui, QtCore
import numpy as np
from enable.api import Component, Container, Window
from chaco.api import *
import sys
#
class ChacoPlot(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ChacoPlot, self).__init__(parent)
        #
        self.container = OverlayPlotContainer(padding=40)
        #
        self.enableWindow = Window(self, -1, component=self.container)
        windowLayout = QtGui.QVBoxLayout(self)
        windowLayout.addWidget(self.enableWindow.control)
        #
        self.xRange = DataRange1D()
        self.yRange = DataRange1D()
        #
        self.xMapper = LinearMapper(range=self.xRange)
        self.yMapper = LinearMapper(range=self.yRange)
        #
        self.plots = {}
        # keep a list of plots added to the container
    #
    def setMinimumSize(self, width, height):
        self.enableWindow.control.setMinimumSize(width, height)
    #
    def addLine(self, name, plotType):
        xSource = ArrayDataSource([0])
        ySource = ArrayDataSource([0])
        #
        self.xRange.add(xSource)
        self.yRange.add(ySource)
        #
        index_mapper = self.xMapper
        value_mapper = self.yMapper
        #
        # plotType is a class name
        plot = plotType(    index = xSource,
                            value = ySource,
                            index_mapper = index_mapper,
                            value_mapper = value_mapper,
                            visible = False
                       )
        #
        self.container.add(plot)
        #
        self.plots[name] = {'plot':plot, 'xSource':xSource, 'ySource':ySource}
    #
    def updateLine(self, name, xData, yData):
        plot = self.plots[name]
        #
        if np.array(xData).size != 0:
            plot['plot'].visible = True
        else:
            plot['plot'].visible = False
            xData = [0]
            yData = [0]
        #
        plot['xSource'].set_data(xData)
        plot['ySource'].set_data(yData)
    #
    def addAxis(self, plotName, orientation):
        plot = self.plots[plotName]['plot']
        #
        if orientation == 'top' or orientation == 'bottom':
            mapper = self.xMapper
        if orientation == 'left' or orientation == 'right':
            mapper = self.yMapper
        #
        axis = PlotAxis(plot, orientation=orientation, mapper=mapper)
        plot.overlays.append(axis)
        #
        return axis
    #
    def addMinorAxis(self, plotName, orientation):
        plot = self.plots[plotName]['plot']
        #
        if orientation == 'top' or orientation == 'bottom':
            mapper = self.xMapper
            range = self.xRange
        if orientation == 'left' or orientation == 'right':
            mapper = self.yMapper
            range = self.yRange
        #
        newAxis = PlotAxis(plot, orientation=orientation, mapper=mapper)
        plot.overlays.append(newAxis)
        #
        newAxis.tick_generator = MinorTickGenerator()
        #
        newAxis.tick_label_formatter  = lambda x: ''
        newAxis.tick_in  = 2
        newAxis.tick_out = 2
    #
#
class MinorTickGenerator(AbstractTickGenerator):
    def __init__(self):
        super(MinorTickGenerator, self).__init__()
    #
    def get_ticks(self, data_low, data_high, bounds_low, bounds_high, interval, use_endpoints=False, scale='linear'):
        interval = interval
        #
        if interval == 'auto':
            interval = auto_interval(data_low, data_high)/5.0
        #
        return auto_ticks(data_low, data_high, bounds_low, bounds_high, interval, use_endpoints)
    #
#
if __name__ == "__main__":
    appQT = QtGui.QApplication.instance()
    #
    x1 = np.arange(300)/18.0
    y1 = np.sin(x1)
    x2 = np.arange(300)/18.0
    y2 = 2.0*np.cos(x2)
    #
    plot = ChacoPlot()
    plot.setMinimumSize(400,300)
    #
    plot.addLine('line1', LinePlot)
    plot.addLine('line2', LinePlot)
    plot.updateLine('line1', x1, y1)
    plot.updateLine('line2', x2, y2)
    #
    plot.addAxis('line1', 'bottom')
    plot.addAxis('line1', 'left')
    plot.addMinorAxis('line1', 'bottom')
    plot.addMinorAxis('line1', 'left')
    #
    plot.show()
    appQT.exec_()

在此处输入图像描述

于 2016-01-17T00:59:40.150 回答