2016-01-12 49 views

回答

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_() 

原文:查科沒有這個功能特別,但你可以通過增加一個額外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_() 

enter image description here

+0

很想看到,變成了查科源公關... –