小编Eel*_*aak的帖子

使用Python/Matplotlib基于色彩图绘制(极性)色轮

我试图用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中绘制一个圆圈,它以适当的矢量/贝塞尔曲线方式定义,并且具有根据色彩图定义的边缘颜色(或者,失败,任意颜色渐变)?

python plot colors matplotlib scipy

17
推荐指数
2
解决办法
9605
查看次数

如何为Matplotlib数字添加剪贴板支持?

在MATLAB中,有一个非常方便的选项可以将当前图形复制到剪贴板.虽然Python/numpy/scipy/matplotlib是MATLAB的一个很好的替代品,但遗憾的是这样的选项丢失了.

这个选项可以轻松添加到Matplotlib数字中吗?优选地,所有MPL数字应该自动受益于该功能.

我正在使用MPL的Qt4Agg后端和PySide.

python clipboard plot matplotlib scipy

7
推荐指数
2
解决办法
5430
查看次数

SVG 过滤器未显示在 Firefox 中,但在 Chrome 中运行良好

我想要一段深色背景上的深色文字,外面有白色的光芒。尽管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: …

html firefox svg google-chrome svg-filters

7
推荐指数
2
解决办法
5031
查看次数

折叠numpy数组的尾随尺寸的简单方法?

在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在上面的例子中,表示该阵列是什么样的.

python arrays numpy multidimensional-array

6
推荐指数
1
解决办法
1215
查看次数

在3D绘图中绘制所有三个轴上的分布轮廓

我在三维空间中有一堆点,并估计了这些点上的一些分布(也在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)

python 3d plot matplotlib mplot3d

6
推荐指数
1
解决办法
906
查看次数

从第二个2D阵列给出的索引周围的1D numpy数组中有效切片窗口

我想从同一个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)

python arrays indexing optimization numpy

2
推荐指数
1
解决办法
967
查看次数