Python 散点图多色条问题
Python Scatter Plot Multiple Colorbar issue
我正在尝试用动态数据绘制散点图。我可以通过循环绘制数据点;但每次它都会创建新的颜色条。
这是我的代码:
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()
我已阅读此 post:How to retrieve colorbar instance from figure in matplotlib。但我真的无法使用它。
你知道它为什么要创建一个新的颜色条吗?以及如何避免?
此致
Panda 的 plot 正在创建新的颜色条,因为您要求它创建一个 (colorbar=True
),看起来现在可以告诉函数已经有一个颜色条并且它应该改用它。
有很多方法可以解决这个问题。
第一个不是不使用 DataFrame.plot()
而是直接使用 matplotlib 来生成绘图。这将使您更好地控制所使用的轴,并让您在帧与帧之间循环使用颜色条。以下是一些可能相关的链接:
- Updating the positions and colors of pyplot.scatter
第二个选项,如果你想让你的代码接近现在的样子,那就是在每一帧擦除整个图形,让pandas
每次都重新创建它需要的轴。即:
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)
我正在尝试用动态数据绘制散点图。我可以通过循环绘制数据点;但每次它都会创建新的颜色条。
这是我的代码:
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()
我已阅读此 post:How to retrieve colorbar instance from figure in matplotlib。但我真的无法使用它。
你知道它为什么要创建一个新的颜色条吗?以及如何避免?
此致
Panda 的 plot 正在创建新的颜色条,因为您要求它创建一个 (colorbar=True
),看起来现在可以告诉函数已经有一个颜色条并且它应该改用它。
有很多方法可以解决这个问题。
第一个不是不使用 DataFrame.plot()
而是直接使用 matplotlib 来生成绘图。这将使您更好地控制所使用的轴,并让您在帧与帧之间循环使用颜色条。以下是一些可能相关的链接:
- Updating the positions and colors of pyplot.scatter
第二个选项,如果你想让你的代码接近现在的样子,那就是在每一帧擦除整个图形,让pandas
每次都重新创建它需要的轴。即:
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)