Название моего субплота Matplotlib удаляется само - PullRequest
0 голосов
/ 11 апреля 2019

Когда я запускаю свой код, я создаю фигуру, а затем создаю подзаговор на этой фигуре. Затем, когда я пытаюсь добавить заголовок к нему, используя ax.set_title("title"), он иногда появляется на долю секунды, а затем исчезает. Я попытался использовать plot.title также безуспешно.

Я попытался воссоздать ошибку в небольшом примере, но по какой-то причине она работала там просто отлично, поэтому вот весь исходный код кода.

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.style as style
import plotgen
from matplotlib.widgets import Button

class plotWindow():
    def __init__(self):
        style.use("bmh")
        self.dp = 30

        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(1, 1, 1, label="ax1")


        self.cax = 1
        self.maxax = 2
        self.minax = 1

        plotgen.clear("plot1.txt")
        plotgen.clear("plot2.txt")

        axnext = plt.axes([0.80, 0.01, 0.06, 0.06])
        axprev = plt.axes([0.73, 0.01, 0.06, 0.06])

        bnext = Button(axnext, 'Next >')
        bnext.on_clicked(self.changePlotNext)
        bprev = Button(axprev, "< Previous")
        bprev.on_clicked(self.changePlotPrev)


        ani = animation.FuncAnimation(self.fig, self.animate, interval=500)
        plt.show()

    def changePlotNext(self, i):
        if self.cax < self.maxax:
            self.cax += 1
            self.ax.set_title("Pump " + str(self.cax))

    def changePlotPrev(self, i):
        if self.cax > self.minax:
            self.cax -= 1
            self.ax.set_title("Pump " + str(self.cax))

    def animate(self, i):
        if self.cax == 1:
            plotgen.generate("plot1.txt")
            graph_data = open('plot1.txt', 'r').read()
            lines = graph_data.split('\n')
            xs = []
            ys = []
            for line in lines:
                if len(line) > 1:
                    x, y = line.split(',')
                    xs.append(x)
                    ys.append(float(y))
            self.ax.clear()
            lx = len(xs)
            ly = len(ys)
            if len(xs) < self.dp:
                pxs = xs
                pys = ys
            else:
                pxs = xs[(lx - (self.dp - 1)):(lx - 1)]
                pys = ys[(ly - (self.dp - 1)):(ly - 1)]
            self.ax.plot(pxs, pys, "r")
        elif self.cax == 2:
            plotgen.generate("plot2.txt")
            graph_data = open('plot2.txt', 'r').read()
            lines = graph_data.split('\n')
            xs = []
            ys = []
            for line in lines:
                if len(line) > 1:
                    x, y = line.split(',')
                    xs.append(x)
                    ys.append(float(y))
            self.ax.clear()
            lx = len(xs)
            ly = len(ys)
            if len(xs) <= self.dp:
                pxs = xs
                pys = ys
            else:
                pxs = xs[(lx - (self.dp - 1)):(lx - 1)]
                pys = ys[(ly - (self.dp - 1)):(ly - 1)]
            self.ax.plot(pxs, pys)
plotWindow()

Как вы можете видеть в моих changePlotNext и changePlotPrev функциях, я пытаюсь изменить заголовок. Иногда они отображаются на долю секунды, когда я меняюсь, но потом это уходит. И я очень хорошо понимаю, что я не установил название для отображения, прежде чем изменить сюжет.

1 Ответ

1 голос
/ 11 апреля 2019

В animate у вас есть self.ax.clear(), который удаляет всех художников, тексты и т. Д. На осях, включая заголовок.

Таким образом, простой способ - сбросить заголовок после очистки осей. Так что если вы добавите:

 self.ax.set_title("Pump " + str(self.cax))

в обоих местах, сразу после того, как вы позвоните self.ax.clear(), ваши заголовки все равно будут показаны.

Другим вариантом будет прекращение очистки осей, а просто удаление предметов, которые необходимо удалить. Я думаю, что это только те линии, которые вы наметили? Так, например, вы можете удалить вызов на self.ax.clear() и добавить:

for line in self.ax.lines:
    line.remove()

на своем месте. Это удалит только нанесенную линию, но сохранит заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...