Ask Your Question

Rotate a 2d plot

asked 2016-11-16 14:35:41 +0200

Paul Bryan gravatar image

I have a 2d plot with multiple arrows, lines etc. and I would like to rotate the entire thing. Here's a simple example without rotation. The real example has more objects on it so I'd rather rotate the entire plot than each individual object.

O = vector((0, 0))
Tp = vector((1, 0))
Np = vector((0, 1))

p = plot([])

p += arrow2d(O, Tp, color="blue")
p += arrow2d(O, Np, color="blue"), aspect_ratio=1)

How can I go about rotating the entire plot by a fixed angle? I have only been able to find information about rotations for 3d plots.

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted

answered 2016-11-16 15:05:57 +0200

ndomes gravatar image

updated 2016-11-19 00:07:44 +0200

For example:

O = vector((0, 0))
Tp = vector((1, 0))
Np = vector((0, 1))

scene = [[Tp,Np],[Tp+Np,-Np]]

alpha = pi/6
R = matrix(2,2,[cos(alpha),-sin(alpha),sin(alpha),cos(alpha)])

p = Graphics()
for obj in scene:
    p += sum([plot(v) for v in obj])
    p += sum([plot(R*v,color='red') for v in obj]), aspect_ratio=1)

Supplement: You can use PIL to rotate an entire plot. PIL is included in Sage.

P1 = plot(x^2,-2,2,thickness=2)'./data/test1.png',xmin=-2,xmax=2,ymin=-2,ymax=2,axes=False)
P2 = point((0,0),color='black',transparent=True) # a dummy plot to draw the axes'./data/test2.png',xmin=-2,xmax=2,ymin=-2,ymax=2)
from PIL import Image
background ="test2.png")
overlay ="test1.png")
overlay = overlay.rotate(-45).resize(background.size)
new_img = Image.blend(background, overlay, 0.7)"new.png")
edit flag offensive delete link more


Thanks! That's effectively what I have done - rotate each object, and it's not so bad if you do it the way you have.

Paul Bryan gravatar imagePaul Bryan ( 2016-11-16 15:14:59 +0200 )edit

Actually, although this solution answers the example in the question, it does not seem to solve my general problem. I have other kinds of graphics objects such as lines, polygons, text labels etc. and some of the vectors will not be based at the same point. I want to be able to rotate the entire scene including such objects. So I essentially need to be able to rotate the entire viewport about a point. At this stage, my solution is to save the image and rotate it using an external editor, but it would certainly by preferable to be able to perform transformations on entire plots from within sage. I think matplotlib has this kind of functionality, but I don't yet know how to achieve it.

Paul Bryan gravatar imagePaul Bryan ( 2016-11-18 15:24:00 +0200 )edit

I edited my answer.

ndomes gravatar imagendomes ( 2016-11-19 00:08:10 +0200 )edit

cool, thanks :)

Paul Bryan gravatar imagePaul Bryan ( 2016-11-19 21:50:35 +0200 )edit

One more solution (pure sage):

ndomes gravatar imagendomes ( 2016-11-19 22:00:07 +0200 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2016-11-16 14:35:41 +0200

Seen: 2,822 times

Last updated: Nov 19 '16