使用Python / Matplotlib

时间:2015-08-11 11:14:46

标签: python matplotlib plot colors scipy

我正在尝试用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([])

Own attempt at creating a color wheel

然而,这种尝试有两个严重的缺点。

首先,当将结果图形保存为矢量(figure_1.svg)时,色轮包含(如预期)621种不同的形状,对应于绘制的不同(x,y)值。虽然结果看起来像一个圆圈,但它并不是真的。我更倾向于使用由它们之间的几个路径点和贝塞尔曲线定义的实际圆,如在matplotlib.patches.Circle。在我看来,这是正确的'这样做的方式,结果看起来更好(没有条带,更好的渐变,更好的抗锯齿)。

第二(相关),最终绘制的标记(2*pi之前的最后几个)与前几个重叠。在像素渲染中很难看到,但是如果你放大基于矢量的渲染,你可以清楚地看到最后一张光盘与前几张光盘重叠。

我尝试使用不同的标记(.|),但没有一个标记围绕第二个问题。

底线:我可以在Python / Matplotlib中绘制一个圆圈,它以适当的矢量/贝塞尔曲线方式定义,并且根据色彩图定义了边缘颜色(或者,如果没有,那么,任意颜色渐变)?

2 个答案:

答案 0 :(得分:15)

我发现的一种方法是生成一个色图,然后将其投影到极轴上。这是一个工作的例子 - 它包括一个令人讨厌的黑客,但(明确评论)。我确信有一种方法可以调整限制或者(更难)编写自己的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

这会产生

colorwheel direct from matplotlib

如果你想要一个戒指而不是一个轮子,请在plt.show()plt.savefig

之前使用它
display_axes.set_rlim([-1,1])

这给出了

color ring

根据评论中的@EelkeSpaak - 如果您按照OP将图形保存为SVG,这里有一个处理结果图形的提示:生成的SVG图像的小元素是触摸和非重叠。这会导致某些渲染器出现微弱的灰色线条(Inkscape,Adobe Reader,可能没有打印)。对此的简单解决方案是使用例如小的(例如120%)缩放到每个单独的梯度元素。 Inkscape或Illustrator。请注意,您必须单独将变换应用于每个元素(所提到的软件提供自动执行此操作的功能),而不是整个绘图,否则它无效。

答案 1 :(得分:5)

我只需要制作色轮并决定更新rsnape的解决方案以与matplotlib 2.1兼容。您可以在极坐标图上绘制极性彩色网格,而不是将颜色条对象放在轴上。

pragma solidity ^0.4.18;

contract A {
  uint256 public balance;

  function() public payable {
    balance = msg.value;
  }
}

contract B is A {
  uint256 i;
  A a;

  function B(address _a) public {
    a = A(_a);
  }

  function receiveForParent() public payable {
    a.transfer(msg.value);
  }

  function getParentBalance() public constant returns (uint256) {
    return a.balance();
  }
}

它给出了这个:

A color wheel for the viridis colormap. Made with matplotlib 2.1.