我正在寻找一种方法,将 matplotlib-pyplot(Python 库)中生成的绘图旋转 45 度(例如,您将拥有菱形而不是方形),有人知道这是否可以做到吗?
我能想到的一种方法是对所有数据使用旋转过滤器,使其看起来旋转,但绘图本身仍将处于原始方向。
我希望能够使用 matplotlib 交互功能,所以保存为图像然后旋转将不起作用。
另外,我想使用 pyplot 函数来绘制绘图,因此使用不同的库进行绘图并不是一个理想的解决方案。
我正在寻找一种方法,将 matplotlib-pyplot(Python 库)中生成的绘图旋转 45 度(例如,您将拥有菱形而不是方形),有人知道这是否可以做到吗?
我能想到的一种方法是对所有数据使用旋转过滤器,使其看起来旋转,但绘图本身仍将处于原始方向。
我希望能够使用 matplotlib 交互功能,所以保存为图像然后旋转将不起作用。
另外,我想使用 pyplot 函数来绘制绘图,因此使用不同的库进行绘图并不是一个理想的解决方案。
好的,所以目前我发现的唯一部分解决方案是对绘图应用旋转。这允许使用 matplotlib/pyplot 提供的交互式界面。
对于像 plot() 和 scatter() 这样的点图,这是微不足道的,但我对旋转 imshow() 特别感兴趣。此链接讨论了可能用于此任务的transform关键字,但它显然不起作用。
幸运的是,我找到了使用 pcolormesh() 的解决方法。pcolormesh() 绘制四边形网格并允许您指定角坐标。因此,答案是仅将相关变换应用于角坐标。但是请注意, pcolormesh() 的工作方式与 imshow 有点不同 - 它绘制您的矩阵翻转。
我在网上的任何地方都没有看到这个解决方案,所以这里有一些 pcolormesh()/imshow() 旋转 45 度的代码:
import matplotlib.pyplot as plt
import numpy as np
def pcolormesh_45deg(C):
n = C.shape[0]
# create rotation/scaling matrix
t = np.array([[1,0.5],[-1,0.5]])
# create coordinate matrix and transform it
A = np.dot(np.array([(i[1],i[0]) for i in itertools.product(range(n,-1,-1),range(0,n+1,1))]),t)
# plot
plt.pcolormesh(A[:,1].reshape(n+1,n+1),A[:,0].reshape(n+1,n+1),np.flipud(C))
基于Bitwise anwer,可以使用如下函数:
def pcolormesh_45deg(C, ax=None, xticks=None, xticklabels=None, yticks=None,
yticklabels=None, aspect='equal', rotation=45,
*args, **kwargs):
import itertools
if ax is None:
ax = plt.gca()
n = C.shape[0]
# create rotation/scaling matrix
t = np.array([[1, .5], [-1, .5]])
# create coordinate matrix and transform it
product = itertools.product(range(n, -1, -1), range(0, n + 1, 1))
A = np.dot(np.array([(ii[1], ii[0]) for ii in product]), t)
# plot
ax.pcolormesh((2 * A[:, 1].reshape(n + 1, n + 1) - n),
A[:, 0].reshape(n + 1, n + 1),
np.flipud(C), *args, **kwargs)
xticks = np.linspace(0, n - 1, n, dtype=int) if xticks is None else xticks
yticks = np.linspace(0, n - 1, n, dtype=int) if yticks is None else yticks
if xticks is not None:
xticklabels = xticks if xticklabels is None else xticklabels
for tick, label, in zip(xticks, xticklabels):
ax.scatter(-n + tick + .5, tick + .5, marker='x', color='k')
ax.text(-n + tick + .5, tick + .5, label,
horizontalalignment='right', rotation=-rotation)
if yticks is not None:
yticklabels = yticks if yticklabels is None else yticklabels
for tick, label, in zip(yticks, yticklabels):
ax.scatter(tick + .5, n - tick - .5, marker='x', color='k')
ax.text(tick + .5, n - tick - .5, label,
horizontalalignment='left', rotation=rotation)
if aspect:
ax.set_aspect(aspect)
ax.set_xlim(-n, n)
ax.set_ylim(-n, n)
ax.plot([-n, 0, n, 0., -n], [0, n, 0, -n, 0], color='k')
ax.axis('off')
return ax
也许如果您在 3D 绘图上执行此操作?
http://matplotlib.1069221.n5.nabble.com/How-to-rotate-a-3D-plot-td19185.html
axes3d.view_init(elev, azim)
这篇文章建议您只能“手动”完成。
可以绘制它,但您必须手动完成所有转换/旋转,包括将轴绘制为 Line2D 实例和标签绘制为 Text 实例(例如参见档案中的“Scatter3D”示例)。目前没有简单的内置方法可以做到这一点。在轴处理的计划重构中,
你看过PIL吗?
此代码将旋转图像。因此,如果您首先将绘图作为图像输出到文件中,那么您可以这样做
import Image
img = Image.open("plot.jpg")
img2 = img.rotate(45)
img2.show()
img2.save("rotate.jpg")