在matplotlib中旋转一个轴
我有一些数据系列 x 和 y,满足 x+y ≤ 1。如果我画一个简单的散点图,它看起来是这样的:
我想把这个图变一下,让正 x 轴和正 y 轴之间的角度变成 60 度,而不是 90 度。简单来说,我想把从原点到 (1,0) 和 (0,1) 形成的区域,从一个等腰直角三角形变成一个等边三角形。
经过各种网上搜索(包括 这个教程),这是我能想到的最接近的办法:
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
import mpl_toolkits.axisartist.floating_axes as floating_axes
fig = plt.figure()
plot_extents = 0, 1, 0, 1
transform = Affine2D().skew_deg(30,0).scale(1,0.8660254038)
helper = floating_axes.GridHelperCurveLinear(transform, plot_extents)
ax = floating_axes.FloatingSubplot(fig, 111, grid_helper=helper)
x = [0.41729137, 0.31693662, 0.25544209, 0.13843966, 0.31218805,0.01035702, 0.4847026 , 0.11104309, 0.25144685, 0.18332651]
y = [0.20372773, 0.5395082 , 0.6020569 , 0.19787512, 0.57743819,0.93317626, 0.43035489, 0.8235019 , 0.36000727, 0.24365175]
ax.scatter(x,y)
ax.set_xlim(-0.15,1.15)
ax.set_ylim(-0.15,1.15)
fig.add_axes(ax)
但是结果似乎只是移动了一个坐标轴,点的位置没有变化。
2 个回答
0
试着在变换的 transform 里加上 rotate_deg(120) 方法,
这样可以旋转坐标系统:
transform = Affine2D().skew_deg(60, 0).scale(1, 0.8660254038).rotate_deg(120)
这是这个方法的代码:
def rotate_deg(self, degrees):
"""
Add a rotation (in degrees) to this transform in place.
Returns *self*, so this method can easily be chained with more
calls to :meth:`rotate`, :meth:`rotate_deg`, :meth:`translate`
and :meth:`scale`.
"""
return self.rotate(math.radians(degrees))
根据文档的说明,这应该是解决办法。
1
感谢@JohanC给我指了个方向,指向了他对一个类似问题的回答。我之前没想到的一点是,当前坐标轴的变换需要加到我想要的变换上。
r = np.random.rand(3,10)
x = r[0]/(r[0]+r[1]+r[2])
y = r[1]/(r[0]+r[1]+r[2])
fig = plt.figure()
plot_extents = 0, 1, 0, 1
transform = Affine2D().skew_deg(30,0).scale(1,0.8660254038)
helper = floating_axes.GridHelperCurveLinear(transform, plot_extents)
ax = floating_axes.FloatingSubplot(fig, 111, grid_helper=helper)
ax.scatter(x,y,transform = ax.transData + transform)
ax.set_xlim(-0.15,1.15)
ax.set_ylim(-0.15,1.15)
fig.add_axes(ax)
我还需要再美化一下,但这已经解决了问题。