我在matplotlib中制作了一些等高线图,破折号的长度太长了.虚线也不好看.我想手动设置短划线的长度.当我使用plt.plot()制作一个简单的绘图时,我可以设置精确的短划线长度,但是我无法弄清楚如何用等高线图做同样的事情.
我认为以下代码应该可以工作,但我收到错误:
File "/Library/Python/2.7/site-packages/matplotlib-1.2.x-py2.7-macosx-10.8-intel.egg/matplotlib/backends/backend_macosx.py", line 80, in draw_path_collection
offset_position)
TypeError: failed to obtain the offset and dashes from the linestyle
Run Code Online (Sandbox Code Playgroud)
以下是我正在尝试做的一个示例,改编自MPL示例:
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)
plt.figure()
CS …Run Code Online (Sandbox Code Playgroud) 我正在尝试将文本文件读入python,但它似乎使用了一些非常奇怪的编码.我试着平常:
file = open('data.txt','r')
lines = file.readlines()
for line in lines[0:1]:
print line,
print line.split()
Run Code Online (Sandbox Code Playgroud)
输出:
0.0200197 1.97691e-005
['0\x00.\x000\x002\x000\x000\x001\x009\x007\x00', '\x001\x00.\x009\x007\x006\x009\x001\x00e\x00-\x000\x000\x005\x00']
Run Code Online (Sandbox Code Playgroud)
打印线条工作正常,但在我尝试拆分线以便我可以将其转换为浮动之后,它看起来很疯狂.当然,当我尝试将这些字符串转换为浮点数时,会产生错误.有关如何将这些转换为数字的任何想法?
如果你想尝试加载它,我把示例数据文件放在这里:https: //dl.dropboxusercontent.com/u/3816350/Posts/data.txt
我想简单地使用numpy.loadtxt或numpy.genfromtxt,但他们也不想处理这个疯狂的文件.
如何在 matplotlib 的 annotate 函数中设置箭头和文本之间的距离(填充)?有时文本最终会离箭头太近,我想将它们分开一点。
基本示例:
import matplotlib.pyplot as plt
plt.annotate('Here it is!',xy=(-1,-1),xytext=(0,0),
arrowprops=dict(arrowstyle='->',lw=1.5))
plt.xlim(-10,10)
plt.ylim(-10,10)
plt.show()
Run Code Online (Sandbox Code Playgroud)

有没有办法使用任何常用的python包将numpy数组保存为16位图像(tif,png)?这是我过去可以开始工作的唯一方法,但我需要安装FreeImage包,这有点烦人.
这似乎是一个非常基本的任务,所以我希望它应该被scipy覆盖,但是scipy.misc.imsave只能做8位.
有任何想法吗?
我在Mac上使用Anaconda python发行版.我想在Github上使用最新版本的matplotlib源代码,进行一些更改,看看它是如何运行的.但是大多数时候我只想使用Anaconda Python附带的matplotlib的正常版本,所以我想要一种方便来回切换的方法.
matplotlib文档对分支和pull-request工作流程有一个很好的描述,但我不清楚我是如何实际安装和使用matplotlib的开发版本的,这将保留我正在运行的Python实现.
我的猜测是我想要建立一个包含最新matplotlib版本及其依赖关系的环境,并在该环境和正常root环境之间切换.但是当我python setup.py develop用来安装matplotlib的开发版本时,它似乎安装到两个环境中.
那么,使用GitHub的Python包的开发版本的最佳实践是什么?
使用Matplotlib,我可以使用"mySlider.val"获取Slider小部件的值,这非常方便.是否有相同的功能来获得当前选择的单选按钮?我认为这个问题是这个问题试图提出的问题,但提问者没有提供一个有效的例子.我提供了以下示例,指出我正在寻找的缺少的代码行.
from matplotlib.widgets import RadioButtons, Button, Slider
import matplotlib.pyplot as plt
axSlider = plt.axes([0.1, 0.8, 0.4, 0.05])
aSlider = Slider(axSlider,'A slider', 0,1, valinit=0.5)
axRadio = plt.axes([0.1, 0.2, 0.3, 0.4])
butRadio = RadioButtons(axRadio, ('Top','Middle','Bottom'))
axStatus = plt.axes([0.5, 0.2, 0.3, 0.4])
bStatus = Button(axStatus,'Get status of radio buttons')
def get_status(val):
#radioValue = ???? -- Need this line of code.
radioValue = 0
sliderValue= aSlider.val
print 'Slider value: %.2f, Radio button value: %.2f'%(sliderValue,radioValue)
bStatus.on_clicked(get_status)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是输出的样子:

如果这是不可能的,你能建议一个优雅的解决方案吗?目前我正在使用单选按钮的"on_clicked"功能,并使用单选按钮的值设置全局变量,这很麻烦.
我有两个数据集:(x,y1)和(x,y2)。我想找到两条曲线相互交叉的位置。目标类似于此问题:在Python中将两个图形相交,找到x值:
但是,此处描述的方法仅找到最接近的数据点的交点。我想找到比原始数据间距更高精度的曲线的交点。一种选择是简单地重新插值到更细的网格。这可行,但是精度由我为重新插值选择的点数确定,这是任意的,并且需要在精度和效率之间进行权衡。
或者,我可以scipy.optimize.fsolve用来查找数据集的两个样条插值的精确交集。这很好用,但是它不能轻易找到多个相交点,需要我对相交点做出合理的猜测,并且可能缩放效果不好。(最终,我想找到几千套(x,y1,y2)的交集,所以一种有效的算法会很好。)
这是我到目前为止所拥有的。有什么改善的想法吗?
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate, scipy.optimize
x = np.linspace(1, 4, 20)
y1 = np.sin(x)
y2 = 0.05*x
plt.plot(x, y1, marker='o', mec='none', ms=4, lw=1, label='y1')
plt.plot(x, y2, marker='o', mec='none', ms=4, lw=1, label='y2')
idx = np.argwhere(np.diff(np.sign(y1 - y2)) != 0)
plt.plot(x[idx], y1[idx], 'ms', ms=7, label='Nearest data-point method')
interp1 = scipy.interpolate.InterpolatedUnivariateSpline(x, y1)
interp2 = scipy.interpolate.InterpolatedUnivariateSpline(x, y2)
new_x = np.linspace(x.min(), x.max(), 100)
new_y1 = interp1(new_x)
new_y2 = interp2(new_x)
idx = np.argwhere(np.diff(np.sign(new_y1 - …Run Code Online (Sandbox Code Playgroud) 我正在使用matplotlib创建一个包含许多小子图(如4行,8列)的图形.我已经尝试了几种不同的方法,而且我能用matplotlib来制作轴的最快速度是~2秒.我看到这篇文章关于只使用一个轴对象来显示许多小图像,但我希望能够在轴上有刻度和标题.有没有办法加速这个过程,或者在matplotlib中制作轴只需要相当长的时间?
这是我到目前为止所尝试的:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import time
fig = plt.figure(figsize=(10,6))
plt.clf(); t = time.time()
grid = ImageGrid(fig, 111,
nrows_ncols = (4, 8))
print 'Time using ImageGrid: %.2f seconds'%(time.time()-t)
plt.clf(); t = time.time()
axes = plt.subplots(4,8)
print 'Time using plt.subplots: %.2f seconds'%(time.time()-t)
plt.clf(); t = time.time()
axes = []
for row in range(0,4):
for col in range(1,9):
ax = plt.subplot(4,8,row*8+col)
axes.append(ax)
print 'Time using ptl.subplot loop: %.2f seconds'%(time.time()-t)
Run Code Online (Sandbox Code Playgroud)
输出:
Time using ImageGrid: 4.25 seconds …Run Code Online (Sandbox Code Playgroud) 我在python中有一些3D(x,y,z,value)数据,我可以在Mayavi中可视化isosurfaces.如何将此isosurface导出到我可以读入Blender的文件中?
这是一些示例代码:
import numpy
from mayavi import mlab
x, y, z = numpy.ogrid[-5:5:64j, -5:5:64j, -5:5:64j]
values = x * x * 0.5 + y * y + z * z * 2.0
mlab.contour3d(values, contours=[.5])
mlab.show()
Run Code Online (Sandbox Code Playgroud) 假设我想在 matplotlib 中绘制一个椭圆:
import numpy as np
import matplotlib.pyplot as plt
x = np.sin(np.linspace(0,2*np.pi,100))
y = 2*np.cos(np.linspace(0,2*np.pi,100))
ax = plt.subplot(111)
ax.plot(x,y)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我可以通过添加五行代码得到我想要的结果:
import numpy as np
import matplotlib.pyplot as plt
x = np.sin(np.linspace(0,2*np.pi,100))
y = 2*np.cos(np.linspace(0,2*np.pi,100))
ax = plt.subplot(111)
ax.plot(x,y)
#make the axes square and equal
ax.set_aspect('equal')
minimum = np.min((ax.get_xlim(),ax.get_ylim()))
maximum = np.max((ax.get_xlim(),ax.get_ylim()))
ax.set_xlim(minimum*1.2,maximum*1.2)
ax.set_ylim(minimum*1.2,maximum*1.2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但这看起来很笨拙。matplotlib 中是否内置了一个函数来自动给出预期的行为?