2016-10-19 2 views
-2

я должен сделать вид Ганта ресурсов диаграммы. Идея сделать несколько горизонтальных полос на одной и той же линии (что соответствует ресурсу) каждый длину, представленную дату начала и дату ирисовать горизонтальные полосы на одной и той же линии

это ожидаемый результат: enter image description here

В целом мы имеем около 200 ресурсов и Максимум. 50 для каждого отображения, поэтому производительность важна.

Любая идея?

Кроме задача должна быть перетаскивать с помощью мыши. Раствор (Fat GUI (PyQt, wxwidget, Tkinter, ...) или веб основе Колба, web2py и т.д.) в порядке

+0

Веб-разрядная версия будет в конечном счете, будет написана на JavaScript. что касается библиотек gui для python, я бы рекомендовал библиотеку привязки Qt или tkinter. кроме этого я не очень-то для вас, потому что вы не показали нам, что вы пробовали или что вы застрять на – Aaron

+0

я видел питона-Ганта, а также Matplotlib. Проблема заключается в том, что я не знаю, как сказать Matplotlib (или другие инструменты), чтобы нарисовать на одной линии, то есть дает начальную и конечную позицию для турника. И это несколько раз для той же линии. Здесь я застрял. Потому что все примеры, которые я видел и пытались, нарисовали бары ниже друг друга или нарисовали штабеля, что явно не так, потому что должно быть определенное расстояние между барами. – Gabor

+0

Вопросы, предлагающие нам ** рекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другой ресурс вне сайта **, не относятся к теме для переполнения стека, поскольку они, как правило, привлекают упрямые ответы и спам. Вместо этого [описать проблему] (http://meta.stackoverflow.com/questions/254393) и что было сделано до сих пор, чтобы решить эту проблему. – MattDMo

ответ

1

На самом деле, я буду обманывать и вывесить вас что-то прямо из Matplotlib Documentation. Это должно заставить вас начать с перетаскиваемых объектов в mpl. вам придется придумать свой собственный динамический код создания объекта ...

полный кредит парням над на MPL:

# draggable rectangle with the animation blit techniques; see 
# http://www.scipy.org/Cookbook/Matplotlib/Animations 
import numpy as np 
import matplotlib.pyplot as plt 

class DraggableRectangle: 
    lock = None # only one can be animated at a time 
    def __init__(self, rect): 
     self.rect = rect 
     self.press = None 
     self.background = None 

    def connect(self): 
     'connect to all the events we need' 
     self.cidpress = self.rect.figure.canvas.mpl_connect(
      'button_press_event', self.on_press) 
     self.cidrelease = self.rect.figure.canvas.mpl_connect(
      'button_release_event', self.on_release) 
     self.cidmotion = self.rect.figure.canvas.mpl_connect(
      'motion_notify_event', self.on_motion) 

    def on_press(self, event): 
     'on button press we will see if the mouse is over us and store some data' 
     if event.inaxes != self.rect.axes: return 
     if DraggableRectangle.lock is not None: return 
     contains, attrd = self.rect.contains(event) 
     if not contains: return 
     print('event contains', self.rect.xy) 
     x0, y0 = self.rect.xy 
     self.press = x0, y0, event.xdata, event.ydata 
     DraggableRectangle.lock = self 

     # draw everything but the selected rectangle and store the pixel buffer 
     canvas = self.rect.figure.canvas 
     axes = self.rect.axes 
     self.rect.set_animated(True) 
     canvas.draw() 
     self.background = canvas.copy_from_bbox(self.rect.axes.bbox) 

     # now redraw just the rectangle 
     axes.draw_artist(self.rect) 

     # and blit just the redrawn area 
     canvas.blit(axes.bbox) 

    def on_motion(self, event): 
     'on motion we will move the rect if the mouse is over us' 
     if DraggableRectangle.lock is not self: 
      return 
     if event.inaxes != self.rect.axes: return 
     x0, y0, xpress, ypress = self.press 
     dx = event.xdata - xpress 
     dy = event.ydata - ypress 
     self.rect.set_x(x0+dx) 
     self.rect.set_y(y0+dy) 

     canvas = self.rect.figure.canvas 
     axes = self.rect.axes 
     # restore the background region 
     canvas.restore_region(self.background) 

     # redraw just the current rectangle 
     axes.draw_artist(self.rect) 

     # blit just the redrawn area 
     canvas.blit(axes.bbox) 

    def on_release(self, event): 
     'on release we reset the press data' 
     if DraggableRectangle.lock is not self: 
      return 

     self.press = None 
     DraggableRectangle.lock = None 

     # turn off the rect animation property and reset the background 
     self.rect.set_animated(False) 
     self.background = None 

     # redraw the full figure 
     self.rect.figure.canvas.draw() 

    def disconnect(self): 
     'disconnect all the stored connection ids' 
     self.rect.figure.canvas.mpl_disconnect(self.cidpress) 
     self.rect.figure.canvas.mpl_disconnect(self.cidrelease) 
     self.rect.figure.canvas.mpl_disconnect(self.cidmotion) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
rects = ax.bar(range(10), 20*np.random.rand(10)) 
drs = [] 
for rect in rects: 
    dr = DraggableRectangle(rect) 
    dr.connect() 
    drs.append(dr) 

plt.show() 
+0

Это не показывает бары в одной строке. Но от Аарона я получил это решение, а от вас - обращение. Большой! – Gabor

Смежные вопросы