我该如何通过90度旋转matplotlib绘图?

40

我在matplotlib中创建了一个图形,其中包含三个子图,一个位于左上象限,一个位于右上象限,另一个位于右下象限。右上角的图包含一个二维图像,而其他两个图是分别投影到Y轴和X轴上的。我想将左上象限子图逆时针旋转90度,以便该图的x轴沿着2D图像的y轴。

对于子图,我意识到可以翻转x和y数据,旋转轴标签,在左侧创建一个绘图标题等。但是我希望找到一个单一的调用,只需旋转整个完成的情节90度。但我找不到任何一个。

有没有简单的方法可以做到这一点?

4个回答

20

很多函数的另一个有趣参数是transform(与orientationpivot不同,这个参数也可以在例如plot中使用)。

transform参数允许您添加一个变换,由Transform对象指定。为了举例说明,以下是如何旋转一些随机数据的图表:

import numpy
from matplotlib import pyplot, transforms

data = numpy.random.randn(100)

# first of all, the base transformation of the data points is needed
base = pyplot.gca().transData
rot = transforms.Affine2D().rotate_deg(90)

# define transformed line
line = pyplot.plot(data, 'r--', transform= rot + base)
# or alternatively, use:
# line.set_transform(rot + base)

pyplot.show()

有关如何旋转补丁的示例,请参见此答案,这也是本答案的灵感来源。


更新

最近我发现使用pyplot.scatter(和其他PathCollections)时,transform参数不如预期。在这种情况下,您可能需要使用offset_transform。有关如何设置offset_transform的更多信息,请参见此答案


3
我很喜欢这个答案-它对我很有帮助。请注意,求和的顺序确实很重要: rot + base != base + rot - ricma

19

许多pyplot的1D图似乎在其参数中具有"orientation"或"pivot"选项。例如,来自matplotlib.org直方图示例:

matplotlib.pyplot.hist(x, 
                       bins=10, 
                       range=None, 
                       normed=False, 
                       weights=None, 
                       cumulative=False, 
                       bottom=None, 
                       histtype=u'bar', 
                       align=u'mid', 
                       orientation=u'vertical', 
                       rwidth=None, 
                       log=False, 
                       color=None, 
                       label=None, 
                       stacked=False, 
                       hold=None, 
                       **kwargs)

只需更改为水平方向 (orientation=u'horizontal')


但是为什么Matplotlib在绘图前要将坐标旋转90度呢? - Shubham S. Naik

6
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig=plt.figure() 
ax=fig.add_subplot(111,projection='3d')

# for rotate the axes and update.
for angle in range(0,360): 
    ax.view_init(30,angle)

plt.show()

2
主要代码:-ax.view_init(-30, -90) - sameer_nubia

1

如果您只想获得旋转图表的视图而不需要正确的坐标,那么很简单:

  1. 交换点(x,y)的轴:(y,x)。
  2. 将y的符号更改为负数(-y,x),则将图表顺时针旋转90度

比如,我们有初始数据:

x_coordinates = np.array([351,345,339,336,333,330,327,324,318,312])
y_coordinates = np.array([84, 84, 83, 82, 81, 80, 80, 79, 78, 77])

它的绘图函数plt.plot(x_coordinates,y_coordinates)的作用是: enter image description here

使用plt.plot(-y_coordinates,x_coordinates)可以将图像逆时针旋转90度: enter image description here

通过交换和改变符号,您不仅可以旋转图像,还可以翻转图像。同样地,在这里,图形轴将不会正确显示。


链接失效了 :( - KansaiRobot
1
我已经删除了之前用于参考的失效链接,并实例化了解决方案。 - Yerbol Sapar
关于解决方案,这是我采取的方法。但是我发现了一个错误。你会看到那儿你没有旋转。原来的X变成了Y,但原来的Y则水平相反的符号(77->-77)。如果你在草稿中,那么这不是什么大问题,但当其他人参与时,他们会注意到这作为一个缺陷。所以这不是一个完整的解决方案。 - KansaiRobot
@KansaiRobot 没错,有些人需要的不仅仅是新的绘图视图,还需要坐标。 - Yerbol Sapar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接