如何解决使用滑块 set_array() 在 matplotlib 图上设置颜色
我有一个带有滑块的 matplotlib
绘图,并且有兴趣设置在滑块以一种或另一种方式拖动时绘制的点的颜色。我知道您可以使用 set_array()
设置点的颜色,但到目前为止,幸运地只传递了 set_array()
一维浮点数数组。当我传递 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',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",**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,artists)
File "/Users/johnsmith/PycharmProjects/LawSchoolData/venv/lib/python2.7/site-packages/matplotlib/image.py",**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 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'
解决方法
set_array()
仅用于在颜色图定义颜色时设置颜色值。您可以创建自定义 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',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()
以下是使用颜色图的示例:
colors = ['k','g','m']
cmap = ListedColormap(colors)
scat = ax.scatter(x[:init],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)
#....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。