如何将matplotlib图像旋转90度?

40 投票
4 回答
169299 浏览
提问于 2025-04-17 23:10

我在matplotlib里做了一个图,里面有三个小图。一个在左上角,一个在右上角,还有一个在右下角。右上角的图是一个二维图像,其他两个图分别是Y轴和X轴的投影。我想把左上角的小图逆时针旋转90度,这样它的X轴就能和右上角二维图的Y轴对齐。

对于这个小图,我知道可以把X和Y的数据调换,旋转轴的标签,或者在左边加个图标题等等。但是我希望能找到一个简单的方法,直接把整个小图旋转90度。可我找不到这样的办法。

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

4 个回答

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

通过交换坐标和改变符号,你不仅可以旋转图像,还可以翻转图像。不过要注意,这样做后图的坐标轴可能不会显示得很准确。

7

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用某个功能时,发现它没有按照预期工作,或者出现了错误信息。这种情况下,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。

在这些论坛上,很多人会分享他们的经验和解决方案。你可以看到其他人遇到的类似问题,以及他们是如何解决的。这不仅能帮助你找到答案,还能让你学到更多的知识,避免将来再犯同样的错误。

总之,遇到问题时,不要害怕去问,很多人都愿意提供帮助。记得把你的问题描述清楚,这样别人才能更好地理解你的困扰,并给出有效的建议。

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()
19

在pyplot的1D图表中,很多图表的参数里似乎都有“方向”或“旋转”的选项。比如,在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'vertical'

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 的信息,可以查看 这个回答

撰写回答