我正在尝试在Python中创建色轮,最好使用Matplotlib。以下工作正常:
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt xval = np.arange(0, 2*pi, 0.01) yval = np.ones_like(xval) colormap = plt.get_cmap('hsv') norm = mpl.colors.Normalize(0.0, 2*np.pi) ax = plt.subplot(1, 1, 1, polar=True) ax.scatter(xval, yval, c=xval, s=300, cmap=colormap, norm=norm, linewidths=0) ax.set_yticks([])
但是,这种尝试有两个严重的缺点。
首先,当将结果图形保存为矢量(Figure_1.svg)时,色轮(按预期方式)由621种不同形状组成,分别对应于要绘制的不同(x,y)值。尽管结果看起来像个圆圈,但实际上并非如此。我非常希望使用一个实际的圆,该圆由一些路径点和它们之间的Bezier曲线定义,例如matplotlib.patches.Circle。在我看来,这是“正确”的做法,结果看起来更好(没有条纹,更好的渐变,更好的抗锯齿)。
matplotlib.patches.Circle
其次(相关),最终绘制的标记(之前的最后几个标记2*pi)与前几个标记重叠。在像素渲染中很难看到,但是如果放大基于矢量的渲染,则可以清楚地看到最后一张光盘与前几张光盘重叠。
2*pi
我尝试使用其他标记(.或|),但是它们都没有解决第二个问题。
.
|
底线:我可以在Python / Matplotlib中画一个圆,该圆以正确的矢量/贝塞尔曲线方式定义,并具有根据颜色图定义的边缘颜色(否则,为任意颜色渐变)?
我发现的一种方法是生成颜色图,然后将其投影到极轴上。这是一个有效的示例- 尽管其中包括一个令人讨厌的骇客(明确注释)。我敢肯定有一种方法可以调整限制,或者(更难)编写自己的限制Transform来解决它,但是我还没有完全解决这个问题。我以为致电的范围Normalize会做到这一点,但显然不会。
Transform
Normalize
import matplotlib.pyplot as plt import numpy as np from matplotlib import cm import matplotlib as mpl fig = plt.figure() display_axes = fig.add_axes([0.1,0.1,0.8,0.8], projection='polar') display_axes._direction = 2*np.pi ## This is a nasty hack - using the hidden field to ## multiply the values such that 1 become 2*pi ## this field is supposed to take values 1 or -1 only!! norm = mpl.colors.Normalize(0.0, 2*np.pi) # Plot the colorbar onto the polar axis # note - use orientation horizontal so that the gradient goes around # the wheel rather than centre out quant_steps = 2056 cb = mpl.colorbar.ColorbarBase(display_axes, cmap=cm.get_cmap('hsv',quant_steps), norm=norm, orientation='horizontal') # aesthetics - get rid of border and axis labels cb.outline.set_visible(False) display_axes.set_axis_off() plt.show() # Replace with plt.savefig if you want to save a file
这产生
如果您想要戒指而不是轮子,请在此之前plt.show()或plt.savefig
plt.show()
plt.savefig
display_axes.set_rlim([-1,1])
这给
按照@EelkeSpaak的注释- 如果按照OP将图形另存为SVG,则以下是处理所得图形的提示:所得SVG图像的小元素相互接触且不重叠。这会导致某些渲染器(Inkscape,Adobe Reader,可能不在打印中)中的灰色线条模糊。一个简单的解决方案是使用例如Inkscape或Illustrator对每个单独的渐变元素应用较小的缩放比例(例如120%)。请注意,您必须将变换单独应用于每个元素(上述软件提供了自动执行此功能的功能),而不是整个图形,否则无效。