使用滑块在matplotlib绘图上设置颜色,设置数组()

2024-10-02 20:40:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有滑块的matplotlib图,我对设置滑块被拖动时绘制的点的颜色很感兴趣。我知道你可以用set_array()设置点的颜色,但到目前为止,幸运的是只通过了set_array()1D浮点数组。当我传递set_array()一个与matplotlib颜色对应的字符串数组时,我收到下面的错误和回溯

下面是一些相关的代码片段,其中包含虚拟信息。为了便于评估。在update(val)中注释掉两行后,出现以下错误。取消对它们的注释,以便set_array()获得一个浮点值,解决了这个问题,但随后我就失去了以任何精度控制颜色的能力。(例如,将“g”更改为“c”不会造成明显的颜色差异。)

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import matplotlib.colors as c

x = np.linspace(1, 100, 100)
y = x**2

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.1, bottom=0.20)

plt.ylim([y.min(), y.max()])
plt.xlim([0, 100])

init = 4

scat = ax.scatter(x[:init], y[:init], s=5, c=['k']*init)
ax_slider = plt.axes([0.15, 0.05, 0.65, 0.03])
slider = Slider(ax_slider, 'Day', 0, 100, valinit=init, valfmt="%i")

#  Update function, called upon slider movement

def update(val):
    val = int(val)

    colors_new = np.array(['k']*val, dtype=object)
    colors_new[::2] = 'g'
    colors_new[1::2] = 'm'
    # colors_new = map(lambda x: c.to_rgb(x), colors_new) 
    # colors_new = np.dot(colors_new, [0.2989, 0.5870, 0.1140])
    scat.set_array(colors_new)

    xx = np.vstack((x[:val], y[:val]))
    scat.set_offsets(xx.T)


#  Call update function on slider value change
slider.on_changed(update)

plt.show()

回溯:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1470, in __call__
    return self.func(*args)
  File "/usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 531, in callit
    func(*args)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/backends/_backend_tk.py", line 310, in idle_draw
    self.draw()
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 12, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 437, in draw
    self.figure.draw(self.renderer)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/figure.py", line 1493, in draw
    renderer, self, artists, self.suppressComposite)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/image.py", line 141, in _draw_list_compositing_images
    a.draw(renderer)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 2635, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/image.py", line 141, in _draw_list_compositing_images
    a.draw(renderer)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/collections.py", line 911, in draw
    Collection.draw(self, renderer)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/collections.py", line 264, in draw
    self.update_scalarmappable()
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/collections.py", line 808, in update_scalarmappable
    self._facecolors = self.to_rgba(self._A, self._alpha)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/cm.py", line 274, in to_rgba
    x = self.norm(x)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/colors.py", line 943, in __call__
    self.autoscale_None(result)
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/colors.py", line 994, in autoscale_None
    self.vmin = A.min()
  File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/numpy/ma/core.py", line 5602, in min
    axis=axis, out=out, **kwargs).view(type(self))
AttributeError: 'str' object has no attribute 'view'

Tags: inpyselfvenvmatplotliblibpackagesline
1条回答
网友
1楼 · 发布于 2024-10-02 20:40:50

set_array()仅在颜色由colormap定义时才用于设置颜色值。您可以创建一个自定义ListedColormap并以数字形式设置值

如果要通过颜色值设置颜色,可以使用set_facecolors()

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

x = np.linspace(1, 100, 100)
y = x**2

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.1, bottom=0.20)

plt.ylim([y.min(), y.max()])
plt.xlim([0, 100])

init = 4

scat = ax.scatter(x[:init], y[:init], s=5, c=['k']*init)
ax_slider = plt.axes([0.15, 0.05, 0.65, 0.03])
slider = Slider(ax_slider, 'Day', 0, 100, valinit=init, valfmt="%i")

#  Update function, called upon slider movement
def update(val):
    val = int(val)

    colors_new = np.array(['k']*val, dtype=object)
    colors_new[::2] = 'g'
    colors_new[1::2] = 'm'
    scat.set_facecolors(colors_new)

    xx = np.vstack((x[:val], y[:val]))
    scat.set_offsets(xx.T)

#  Call update function on slider value change
slider.on_changed(update)

plt.show()

example plot

以下是使用颜色贴图的示例:

colors = ['k', 'g', 'm']
cmap = ListedColormap(colors)
scat = ax.scatter(x[:init], y[:init], s=5, c=np.zeros(init), cmap=cmap, vmin=0, vmax=len(colors)-1)

#....

def update(val):
    val = int(val)

    colors_new = np.zeros(val)
    colors_new[::2] = 1
    colors_new[1::2] = 2
    scat.set_array(colors_new)
    #....

相关问题 更多 >