【问题标题】:Minor ticks in Chaco plot?查科情节中的小蜱虫?
【发布时间】:2017-01-15 11:52:24
【问题描述】:

Chaco 中的小记号总是被省略:

这并不总是很方便。是否有可能在 Chaco 中像 matplotlib 中那样有轻微的滴答声:

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

【问题讨论】:

    标签: python plot enthought chaco


    【解决方案1】:

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

    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-11-15
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      相关资源
      最近更新 更多