Проблема с несколькими цветными полосами в Python Scatter Plot - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь нарисовать точечный график с динамическими данными.Я могу рисовать точки данных с помощью циклов;но каждый раз он создает новую цветовую панель.

Вот мой код:

import time
from threading import Thread
import pandas as pd
import matplotlib.pyplot as plt
import random

class RealTime:
    def __init__(self):
        self.flight_complete = True
        self.data = pd.DataFrame(data=None, columns=list('ABC'))
        self.fig=None
        self.axis = None

def on_launch(self):
    plt.ion()
    self.fig = plt.figure()
    self.axis = self.fig.add_subplot(111)

def create_data(self):
    x = round(random.uniform(-1, 1), 2)
    y = round(random.uniform(-1.65, 1.65), 2)
    z = 0.5
    temp_data = pd.DataFrame([[x, y, z]], columns=list('ABC'))
    self.data = self.data.append(temp_data, ignore_index=True)
    # Plot the data
    self.plot()

def start_fly(self):
    self.on_launch()
    fly = Thread(target=self.fly_running)
    fly.start()

def fly_running(self):
    for _ in range(10):
        print("Flying")
        # Create the data
        self.create_data()
        time.sleep(0.1)
    return

def plot(self):
    plt.gca().cla()
    self.data.plot(kind="scatter", x="A", y="B", alpha=0.4,
                        s=50, label="Real Time Position",
                        c="C", cmap=plt.get_cmap("jet"), colorbar=True, ax=self.axis)

    plt.colormaps()
    plt.title("Flight Path Map")
    self.fig.canvas.draw()
    self.fig.canvas.flush_events()


if __name__ == '__main__':
    obj = RealTime()
    obj.on_launch()
    obj.fly_running()

Я прочитал этот пост: Как получить экземпляр цветной панели из рисунка в matplotlib .Но я не мог по-настоящему с этим работать.

Знаете ли вы, почему он создает новую цветовую панель?и как этого избежать?

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 16 ноября 2018

Сюжет Panda создает новый колобар, потому что вы просите его создать его (colorbar=True), и похоже, что теперь есть способ сообщить функции, что цветовая полоса уже есть и что она должна использовать ее вместо этого.

Есть много способов обойти эту проблему.

первым будет не использовать DataFrame.plot(), а вместо этого использовать matplotlib напрямую для генерации графика. Это даст вам больше контроля над осями, которые вы используете, и позволит вам перерабатывать цветовую панель от кадра к кадру. Вот несколько ссылок, которые могут иметь отношение к теме:

второй вариант, если вы хотите, чтобы ваш код был близок к тому, что есть сейчас, чтобы стереть всю фигуру в каждом кадре и позволить pandas воссоздавать оси, которые ему нужны каждый раз. i.e.:

def plot(self):
    self.fig.clf()
    self.axis = self.fig.add_subplot(111)
    self.axis = self.data.plot(kind="scatter", x="A", y="B", alpha=0.4,
                               s=50, label="Real Time Position",
                               c="C", cmap=plt.get_cmap("jet"), colorbar=True, ax=self.axis)
...