我试图用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([])
Run Code Online (Sandbox Code Playgroud)
然而,这种尝试有两个严重的缺点.
首先,当将结果图形保存为矢量(figure_1.svg)时,色轮包含(如预期)621种不同的形状,对应于绘制的不同(x,y)值.虽然结果看起来像一个圆圈,但事实并非如此.我更倾向于使用一个实际的圆,由几个路径点和它们之间的贝塞尔曲线定义,如例如matplotlib.patches.Circle.这在我看来是"正确"的方式,结果看起来更好(没有条带,更好的渐变,更好的抗锯齿).
第二个(相关地),最终绘制的标记(前面的最后几个2*pi)与前几个重叠.在像素渲染中很难看到,但如果你放大基于矢量的渲染,你可以清楚地看到最后一张光盘与前几张光盘重叠.
我尝试使用不同的标记(.或|),但没有一个绕过第二个问题.
底线:我可以在Python/Matplotlib中绘制一个圆圈,它以适当的矢量/贝塞尔曲线方式定义,并且具有根据色彩图定义的边缘颜色(或者,失败,任意颜色渐变)?
在MATLAB中,有一个非常方便的选项可以将当前图形复制到剪贴板.虽然Python/numpy/scipy/matplotlib是MATLAB的一个很好的替代品,但遗憾的是这样的选项丢失了.
这个选项可以轻松添加到Matplotlib数字中吗?优选地,所有MPL数字应该自动受益于该功能.
我正在使用MPL的Qt4Agg后端和PySide.
我想要一段深色背景上的深色文字,外面有白色的光芒。尽管CSS 中的默认阴影过滤器(如filter: drop-shadow(2px 2px 2px black))官方应该支持“spread-radius”第四个属性,但对这个属性的支持基本上不存在。如果没有这种额外的扩展,阴影将不会大到无法阅读文本。
所以,我决定在 SVG 标签中定义我自己的过滤器,包括一个扩张操作来实现额外的传播,并将其应用于文本。此过滤器在 Chrome 中运行良好,但会导致文本在 Firefox 中完全不可见(均在 Ubuntu 14.04 下测试)。根据caniuse.com(通常非常可靠,我发现),Firefox 应该完美地支持过滤器。
带有 SVG 过滤器的 HTML 代码:
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="my-drop-shadow" x="0" y="0" width="200%" height="200%">
<feColorMatrix type="matrix" values=
"0 0 0 0 1
0 0 0 0 1
0 0 0 0 1
0 0 0 1 0"/>
<feMorphology operator="dilate" radius="2" />
<feGaussianBlur stdDeviation="2" in="coloredOut" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
</svg>
<p>Hello there.</p>
Run Code Online (Sandbox Code Playgroud)
CSS: …
在Matlab中,我可以执行以下操作:
X = randn(25,25,25);
size(X(:,:))
ans =
25 625
Run Code Online (Sandbox Code Playgroud)
我经常发现自己想要快速折叠数组的尾随维度,并且不知道如何在numpy中执行此操作.
我知道我可以这样做:
In [22]: x = np.random.randn(25,25,25)
In [23]: x = x.reshape(x.shape[:-2] + (-1,))
In [24]: x.shape
Out[24]: (25, 625)
Run Code Online (Sandbox Code Playgroud)
但x.reshape(x.shape[:-2] + (-1,))是很多简洁的少(和需要更多的信息x),比简单地做x(:,:).
我显然尝试过类似的numpy索引,但这并不能按预期工作:
In [25]: x = np.random.randn(25,25,25)
In [26]: x[:,:].shape
Out[26]: (25, 25, 25)
Run Code Online (Sandbox Code Playgroud)
有关如何以简洁的方式折叠数组的尾随尺寸的任何提示?
编辑:请注意,我在生成的数组本身之后,而不仅仅是它的形状.我只是用size()和x.shape在上面的例子中,表示该阵列是什么样的.
我在三维空间中有一堆点,并估计了这些点上的一些分布(也在3D空间中;使用核密度估计,尽管这与此问题无关).我想将该分布的投影绘制为所有三个轴(x,y和z)上的等高线图.对z轴执行此操作非常简单(即投影到具有相同z坐标的平面上):
import numpy as np
import scipy as sp
import scipy.stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
# generate some points of a 3D Gaussian
points = np.random.normal(size=(3, 50))
# do kernel density estimation to get smooth estimate of distribution
# make grid of points
x, y, z = np.mgrid[-4:4:100j, -4:4:100j, -4:4:100j]
kernel = sp.stats.gaussian_kde(points)
positions = np.vstack((x.ravel(), y.ravel(), z.ravel()))
density = np.reshape(kernel(positions).T, x.shape)
# now density is 100x100x100 ndarray
# plot points
ax = plt.subplot(projection='3d') …Run Code Online (Sandbox Code Playgroud) 我想从同一个1D numpy数组中提取多个切片,其中切片索引是从随机分布中提取的.基本上,我想实现以下目标:
import numpy as np
import numpy.random
# generate some 1D data
data = np.random.randn(500)
# window size (slices are 2*winsize long)
winsize = 60
# number of slices to take from the data
inds_size = (100, 200)
# get random integers that function as indices into the data
inds = np.random.randint(low=winsize, high=len(data)-winsize, size=inds_size)
# now I want to extract slices of data, running from inds[0,0]-60 to inds[0,0]+60
sliced_data = np.zeros( (winsize*2,) + inds_size )
for k in range(inds_size[0]): …Run Code Online (Sandbox Code Playgroud)