matplotlib - 线集合的控制capstyle /大量的线路(matplotlib - c

2019-07-30 12:53发布

同样为前一个问题我的,我想控制线的capstyle使用matplotlib正在绘制。 但是,我有一个非常大的行数,并以比网上收集的任何其他绘图需要的时间太长了。 是否有任何变通办法来控制线收线的capstyle在一个通用的方法(或者,绘制了大量的超快速方法Line2D线)。 举例来说,我已经通过使用matplotlib率控制设定的尝试:

import matplotlib as mpl
mpl.rcParams['lines.solid_capstyle'] = 'round'
mpl.rcParams['lines.solid_joinstyle'] = 'round'

但这似乎没有任何影响。 从文档字符串为collections.py

这些类并不意味着是它们的单一元素的同行(例如,你可能无法选择所有线型),灵活,但他们注定要快共同使用情况下(如大集实线segemnts的)

这就解释了为什么我似乎无法控制各种参数,但是我还是要做到这一点! 我有一个看的AGG后端(代码_backend_agg.cpp :不是我真正了解它),并且看起来line_cap和line_join通过控制gc.capgc.join ,其中GC来自GCAgg类。 有谁知道一个如何从Python的控制呢? 我要求正确的问题吗? 也许这更简单的方法来控制这些参数?

任何帮助,不胜感激...,我渴望能够得到这个工作,所以即使是疯狂的黑客的欢迎!

谢谢,

卡森

Answer 1:

既然你在你的问题,你不介意“脏”的解决方案提了,其中一个方案是如下。

一个特定的“绘图过程” LineCollection由处理draw中所定义的方法Collection的类(的基部LineCollection )。 该方法创建的实例GraphicsContextBase (定义在backend_bases.py经由语句) gc = renderer.new_gc() 这似乎是正是这个对象除其他事物的属性控制支配capstyle (财产_capstyle )。 因此,人们可以继承GraphicsContextBase ,覆盖_capstyle财产,并注入了新的new_gc方法进入RendererBase类,以便后续调用new_gc返回定制的实例:

借用由@florisvb(假设Python3)的回答的例子:

#!/usr/bin/env python
import types

import numpy as np
from matplotlib.backend_bases import GraphicsContextBase, RendererBase
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

class GC(GraphicsContextBase):
    def __init__(self):
        super().__init__()
        self._capstyle = 'round'

def custom_new_gc(self):
    return GC()

RendererBase.new_gc = types.MethodType(custom_new_gc, RendererBase)
#----------------------------------------------------------------------
np.random.seed(42)

x = np.random.random(10)
y = np.random.random(10)

points = np.array([x, y]).T.reshape((-1, 1, 2))
segments = np.concatenate([points[:-1], points[1:]], axis=1)

fig = plt.figure()
ax = fig.add_subplot(111)

linewidth = 10
lc = LineCollection(segments, linewidths=linewidth)
ax.add_collection(lc)

fig.savefig('fig.png')

这将产生:



Answer 2:

我用同样的问题挣扎。 我结束了绘制在我行收集上的散点图。 它并不完美,但它可以为你的应用程序。 那里有几个细微之处 - 下面是一个工作示例。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

x = np.random.random(10)
y = np.random.random(10)
z = np.arange(0,10)

points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

fig = plt.figure()
ax = fig.add_subplot(111)

linewidth = 10
cmap = plt.get_cmap('jet')
norm = plt.Normalize(np.min(z), np.max(z))
color = cmap(norm(z))

lc = LineCollection(segments, linewidths=linewidth, cmap=cmap, norm=norm)
lc.set_array(z)
lc.set_zorder(z.tolist())
ax.add_collection(lc)

ax.scatter(x,y,color=color,s=linewidth**2,edgecolor='none', zorder=(z+2).tolist())


文章来源: matplotlib - control capstyle of line collection/large number of lines