小编Bli*_*ink的帖子

在Python/Matplotlib中动画"增长"线图

我想制作一组可用于为不断增长的线条绘制动画的帧.在过去,我总是使用plt.draw()和set_ydata()来重绘y数据,因为它随着时间的推移而变化.这一次,我希望绘制一条"增长"的线,随着时间的推移在图形中移动.因此,set_ydata不起作用(xdata正在改变长度).例如,

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
for n in range(len(x)):
    plt.plot(x[:n], y[:n], color='k')
    plt.axis([0, 10, 0, 1])
    plt.savefig('Frame%03d.png' %n)
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但随着它的扩展它变得非常慢.有更快的方法吗?

python graphics animation matplotlib

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

改变3D图(Matplotlib)的垂直(z)轴的位置?

我正在使用Python中的Matplotlib做一些3D表面图,并注意到一种恼人的现象.根据我设置视点(摄像机位置)的方式,垂直(z)轴在左侧和右侧之间移动.以下是两个示例:示例1,左侧轴,示例2,右侧轴.第一个例子有ax.view_init(25,-135),而第二个例子有ax.view_init(25,-45).

我想保持观点相同(查看数据的最佳方式).有没有办法强制轴到一侧或另一侧?

python matplotlib mplot3d

14
推荐指数
2
解决办法
7189
查看次数

为什么random.choice这么慢?

在编写脚本时,我发现了numpy.random.choice函数.我实现它是因为它比等效的if语句更清晰.但是,在运行脚本后,我意识到这是显著比if语句慢.

以下是MWE.第一种方法需要0.0秒,而第二种方法需要7.2秒.如果你扩展i循环,你会看到random.choice的速度变慢了.

任何人都可以评论为什么random.choice这么慢?

import numpy as np
import numpy.random as rand
import time as tm

#-------------------------------------------------------------------------------

tStart = tm.time()
for i in xrange(100):
    for j in xrange(1000):
        tmp = rand.rand()
        if tmp < 0.25:
            var = 1
        elif tmp < 0.5:
            var = -1
print('Time: %.1f s' %(tm.time() - tStart))

#-------------------------------------------------------------------------------

tStart = tm.time()
for i in xrange(100):
    for j in xrange(1000):
        var = rand.choice([-1, 0, 1], p = [0.25, 0.5, 0.25])
print('Time: %.1f s' %(tm.time() …
Run Code Online (Sandbox Code Playgroud)

python random numpy

8
推荐指数
1
解决办法
7316
查看次数

Python matplotlib:将轴标签/图例从粗体更改为常规重量

我正在尝试制作一些出版品质的图,但我遇到了一个小问题.默认情况下,matplotlib轴标签和图例条目的加权比轴刻度标记重.无论如何强制轴标签/图例条目与刻度线的重量相同?

import matplotlib.pyplot as plt
import numpy as np

plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)

fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel('x-Axis')
plt.ylabel('y-Axis')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我可以使用数学模式,但问题(烦恼)是当我有一个标签的句子,即,

plt.xlabel('$\mathrm{This is the x-axis}$') 
Run Code Online (Sandbox Code Playgroud)

它把所有这一切都搞砸了.我可以通过使用来解决它

plt.xlabel('$\mathrm{This\: is\: the\: x-axis}$')
Run Code Online (Sandbox Code Playgroud)

但这需要很多标点符号.我希望有一些我可以改变的东西可以让我绕过\mathrm{}格式,并使用标准的TeX格式.

我尝试的另一个选项是使用\text而不是\mathrm,但似乎Python的解释器在没有加载包amsmath的情况下无法识别.我也尝试过:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}']

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)

fig = …
Run Code Online (Sandbox Code Playgroud)

python latex matplotlib

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

为传奇结合两个Pyplot补丁

我试图用置信带绘制一些数据.我正在为每个数据流创建两个图:plotfill_between.我希望图例看起来类似于图表,其中每个条目都有一个框(置信区域的颜色),中间有一条较暗的实线.到目前为止,我已经能够使用补丁来创建矩形图例键,但我不知道如何实现中心线.我尝试使用舱口,但无法控制位置,厚度或颜色.

我最初的想法是尝试组合两个补丁(Patch和2DLine); 然而,它还没有奏效.有更好的方法吗?我的MWE和当前数字如下所示.

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,1,11)
y = np.linspace(0,1,11)

plt.plot(x, y, c='r')
plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5)
p = mpatches.Patch(color='r', alpha=0.5, linewidth=0)

plt.legend((p,), ('Entry',))
Run Code Online (Sandbox Code Playgroud)

数字

python data-visualization matplotlib legend

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

隐藏内部刻度线并在 matplotlib 子图上选择外部刻度标签?

我有一个由 6 个形状为 (2, 3) 的子图组成的图形。我想删除所有内部刻度线,只有左侧和底部显示刻度标签。

默认刻度线:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2,3,
                       sharex = True,
                       sharey = True)
plt.subplots_adjust(hspace = 0,
                    wspace = 0)
Run Code Online (Sandbox Code Playgroud)

产生这个:

默认

在查看了无数示例后,我设法删除了内部刻度线,但现在出现了新的(附加的)刻度线标签。我找到的删除刻度标签的解决方案不起作用,它们删除了所有 x(或 y)刻度标签,而不仅仅是指定的轴。

新代码:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2,3,
                       sharex = True,
                       sharey = True)
plt.subplots_adjust(hspace = 0,
                    wspace = 0)
ax[0,0].xaxis.set_ticks_position('top')
ax[0,0].yaxis.set_ticks_position('left')
ax[0,1].xaxis.set_ticks_position('top')
ax[0,1].yaxis.set_ticks_position('none')
ax[0,2].xaxis.set_ticks_position('top')
ax[0,2].yaxis.set_ticks_position('right')

ax[1,0].xaxis.set_ticks_position('bottom')
ax[1,0].yaxis.set_ticks_position('left')
ax[1,1].xaxis.set_ticks_position('bottom')
ax[1,1].yaxis.set_ticks_position('none')
ax[1,2].xaxis.set_ticks_position('bottom')
ax[1,2].yaxis.set_ticks_position('right')
Run Code Online (Sandbox Code Playgroud)

产生这个:

试图

我希望最终输出是这样的:

最终的

注意左侧和底部的标签,但在周边有刻度线。

python matplotlib

4
推荐指数
1
解决办法
3087
查看次数

图例中的两种线条样式

我有一个有两种线条样式的图(实线和虚线).我希望它们可用于相同的图例条目.下面的代码生成典型的图例,有两个条目.

import matplotlib.pyplot as plt
import numpy as np

xy = np.linspace(0,10,10)

plt.figure()
plt.plot(xy,xy, c='k', label='solid')
plt.plot(xy,xy+1, c='k', ls='dashed', label='dashed')
plt.plot(xy,xy-1, c='k', ls='dashed')
plt.legend()

plt.show()
Run Code Online (Sandbox Code Playgroud)

我想要的是类似的东西:

我曾尝试过与代理艺术家一起玩,但似乎无法获得两条线,彼此相互偏移以显示一个条目.

python plot matplotlib legend

4
推荐指数
2
解决办法
1802
查看次数