How to make sure that both x and y axes of plot are of equal sizes?
I want to make x
and y
axes be of equal lengths (i.e the plot minus the legend should be square ). I wish to plot the legend outside (I have already been able to put legend outside the box). The span of x axis
in the data (x_max - x_min
) is not the same as the span of y axis
in the data (y_max - y_min
).
This is the relevant part of the code that I have at the moment:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 )
plt.axis('equal')
plt.tight_layout()
The following link is an example of an output plot that I am getting : plot
How can I do this?
python python-2.7 matplotlib
add a comment |
I want to make x
and y
axes be of equal lengths (i.e the plot minus the legend should be square ). I wish to plot the legend outside (I have already been able to put legend outside the box). The span of x axis
in the data (x_max - x_min
) is not the same as the span of y axis
in the data (y_max - y_min
).
This is the relevant part of the code that I have at the moment:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 )
plt.axis('equal')
plt.tight_layout()
The following link is an example of an output plot that I am getting : plot
How can I do this?
python python-2.7 matplotlib
add a comment |
I want to make x
and y
axes be of equal lengths (i.e the plot minus the legend should be square ). I wish to plot the legend outside (I have already been able to put legend outside the box). The span of x axis
in the data (x_max - x_min
) is not the same as the span of y axis
in the data (y_max - y_min
).
This is the relevant part of the code that I have at the moment:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 )
plt.axis('equal')
plt.tight_layout()
The following link is an example of an output plot that I am getting : plot
How can I do this?
python python-2.7 matplotlib
I want to make x
and y
axes be of equal lengths (i.e the plot minus the legend should be square ). I wish to plot the legend outside (I have already been able to put legend outside the box). The span of x axis
in the data (x_max - x_min
) is not the same as the span of y axis
in the data (y_max - y_min
).
This is the relevant part of the code that I have at the moment:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 )
plt.axis('equal')
plt.tight_layout()
The following link is an example of an output plot that I am getting : plot
How can I do this?
python python-2.7 matplotlib
python python-2.7 matplotlib
edited Jan 7 at 23:11
user10853036
asked Jan 7 at 20:51
user10853036user10853036
134
134
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
Would plt.axis('scaled')
be what you're after? That would produce a square plot, if the data limits are of equal difference.
If they are not, you could get a square plot by setting the aspect of the axes to the ratio of xlimits and ylimits.
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")
ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))
plt.show()
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me usingplt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?
– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:axes = plt.gca()
, 2nd line:axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line :plt.tight_layout()
, 4th line:plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
|
show 1 more comment
One option you have to is manually set the limits, assuming that you know the size of your dataset.
axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])
A better option would be to iterate through your data to find the maximum x- and y-coordinates, take the greater of those two numbers, add a little bit more to that value to act as a buffer, and set xmax
and ymax
to that new value. You can use a similar method to set xmin
and ymin
: instead of finding the maximums, find the minimums.
To put the legend outside of the plot, I would look at this question: How to put the legend out of the plot
I have already been able to put legend outside the box (The figure shows as much). The span ofx axis
in the data (x_max -
x_min) is not the same as the span ofy axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).
– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
add a comment |
Something that hasn't been mentioned yet but which can give you a square output is to simply set the size of the figure using figsize=(x,y)
in constructing the figure. For example,
import matplotlib.pyplot as plt
import numpy as np
import random
x = np.arange(0, 10, 0.2)
y = np.zeros((len(x)))
for ii in range(len(x)):
y[ii] = random.random()*20
fig = plt.figure(figsize=(5,5), dpi=150)
plt.scatter(x, y, label="Data", marker="+")
plt.title("Title")
plt.legend(bbox_to_anchor=(1.01, 0.5), loc="center left", borderaxespad=0.)
plt.show()
Important note This method will not produce a square plot if plt.tight_layout()
is also used - doing so will always squeeze the ticklabels and anything else that is added (title, legend, axis labels, etc) into the region created by figsize
thereby reducing the aspect ratio below 1:1.
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to useset_aspect
where this does not (the figure size can be set withrcParams
instead of in constructing the figure).
– William Miller
Jan 8 at 16:55
1
If you don't have a handle in pyplot you may always doplt.gca().set_something
.
– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54081694%2fhow-to-make-sure-that-both-x-and-y-axes-of-plot-are-of-equal-sizes%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Would plt.axis('scaled')
be what you're after? That would produce a square plot, if the data limits are of equal difference.
If they are not, you could get a square plot by setting the aspect of the axes to the ratio of xlimits and ylimits.
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")
ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))
plt.show()
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me usingplt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?
– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:axes = plt.gca()
, 2nd line:axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line :plt.tight_layout()
, 4th line:plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
|
show 1 more comment
Would plt.axis('scaled')
be what you're after? That would produce a square plot, if the data limits are of equal difference.
If they are not, you could get a square plot by setting the aspect of the axes to the ratio of xlimits and ylimits.
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")
ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))
plt.show()
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me usingplt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?
– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:axes = plt.gca()
, 2nd line:axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line :plt.tight_layout()
, 4th line:plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
|
show 1 more comment
Would plt.axis('scaled')
be what you're after? That would produce a square plot, if the data limits are of equal difference.
If they are not, you could get a square plot by setting the aspect of the axes to the ratio of xlimits and ylimits.
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")
ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))
plt.show()
Would plt.axis('scaled')
be what you're after? That would produce a square plot, if the data limits are of equal difference.
If they are not, you could get a square plot by setting the aspect of the axes to the ratio of xlimits and ylimits.
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")
ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))
plt.show()
answered Jan 7 at 21:45
ImportanceOfBeingErnestImportanceOfBeingErnest
130k13139215
130k13139215
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me usingplt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?
– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:axes = plt.gca()
, 2nd line:axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line :plt.tight_layout()
, 4th line:plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
|
show 1 more comment
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me usingplt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?
– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:axes = plt.gca()
, 2nd line:axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line :plt.tight_layout()
, 4th line:plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
Thanks for your answer. Will it matter if the legend is outside of the plot? I will like to have the part of the plot which is without the legend be a square (I will like to have the legend besides this square plot). In my case, the data limits are not of equal difference.
– user10853036
Jan 7 at 21:51
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
It shouldn't matter if there is another subplot, or a legend next to the plot for this to work. I'd say try it out and see if you're happy with the result, else come back and explain any further problem.
– ImportanceOfBeingErnest
Jan 7 at 21:53
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me using
plt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?– user10853036
Jan 7 at 22:05
Thanks for your answer. I tried it. It works, but there is this one issue - the sides of the plot get cut (this is with me using
plt.tight_layout()
. Here is the plot that I am getting after using the above suggestions. ( i.stack.imgur.com/sn6zj.png ) How can I not have the sides of the figure cut?– user10853036
Jan 7 at 22:05
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
That shouldn't happen. Did you call tight_layout before setting the aspect?
– ImportanceOfBeingErnest
Jan 7 at 22:23
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:
axes = plt.gca()
, 2nd line: axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line : plt.tight_layout()
, 4th line: plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
I called tight_layout after setting the aspect. I don't have subplots, so I tried this method which is based on your suggestion. This is what I am doing in the relevant section of the code: 1st line:
axes = plt.gca()
, 2nd line: axes.set_aspect( np.diff(axes.get_xlim())/np.diff(axes.get_ylim()) )
, 3rd line : plt.tight_layout()
, 4th line: plt.savefig('filename.png')
– user10853036
Jan 7 at 22:26
|
show 1 more comment
One option you have to is manually set the limits, assuming that you know the size of your dataset.
axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])
A better option would be to iterate through your data to find the maximum x- and y-coordinates, take the greater of those two numbers, add a little bit more to that value to act as a buffer, and set xmax
and ymax
to that new value. You can use a similar method to set xmin
and ymin
: instead of finding the maximums, find the minimums.
To put the legend outside of the plot, I would look at this question: How to put the legend out of the plot
I have already been able to put legend outside the box (The figure shows as much). The span ofx axis
in the data (x_max -
x_min) is not the same as the span ofy axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).
– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
add a comment |
One option you have to is manually set the limits, assuming that you know the size of your dataset.
axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])
A better option would be to iterate through your data to find the maximum x- and y-coordinates, take the greater of those two numbers, add a little bit more to that value to act as a buffer, and set xmax
and ymax
to that new value. You can use a similar method to set xmin
and ymin
: instead of finding the maximums, find the minimums.
To put the legend outside of the plot, I would look at this question: How to put the legend out of the plot
I have already been able to put legend outside the box (The figure shows as much). The span ofx axis
in the data (x_max -
x_min) is not the same as the span ofy axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).
– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
add a comment |
One option you have to is manually set the limits, assuming that you know the size of your dataset.
axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])
A better option would be to iterate through your data to find the maximum x- and y-coordinates, take the greater of those two numbers, add a little bit more to that value to act as a buffer, and set xmax
and ymax
to that new value. You can use a similar method to set xmin
and ymin
: instead of finding the maximums, find the minimums.
To put the legend outside of the plot, I would look at this question: How to put the legend out of the plot
One option you have to is manually set the limits, assuming that you know the size of your dataset.
axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])
A better option would be to iterate through your data to find the maximum x- and y-coordinates, take the greater of those two numbers, add a little bit more to that value to act as a buffer, and set xmax
and ymax
to that new value. You can use a similar method to set xmin
and ymin
: instead of finding the maximums, find the minimums.
To put the legend outside of the plot, I would look at this question: How to put the legend out of the plot
answered Jan 7 at 21:00
Nicholas SchmellerNicholas Schmeller
2126
2126
I have already been able to put legend outside the box (The figure shows as much). The span ofx axis
in the data (x_max -
x_min) is not the same as the span ofy axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).
– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
add a comment |
I have already been able to put legend outside the box (The figure shows as much). The span ofx axis
in the data (x_max -
x_min) is not the same as the span ofy axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).
– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
I have already been able to put legend outside the box (The figure shows as much). The span of
x axis
in the data (x_max -
x_min) is not the same as the span of y axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).– user10853036
Jan 7 at 21:03
I have already been able to put legend outside the box (The figure shows as much). The span of
x axis
in the data (x_max -
x_min) is not the same as the span of y axis
in the data (y_max -
y_min). The only thing I want is to make x and y axes be of equal lengths (i.e the plot minus the legend should be square ).– user10853036
Jan 7 at 21:03
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Unless I'm misunderstanding something, I think you should be able to do what I described above. Let me know if it doesn't work
– Nicholas Schmeller
Jan 7 at 21:13
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
Nicholas: Thanks for your help. I really appreciate it. Unfortunately, it doesn't seem to work. I tried your suggestion. This is what I tried: plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 ) axes = plt.gca() xmin = np.min( XX[ : , 0 ] ) xmax = np.max( XX[ : , 0 ] ) ymin = np.min( XX[ : , 1 ] ) ymax = np.max( XX[ : , 1 ] ) axes.set_xlim([xmin,xmax]) axes.set_ylim([ymin,ymax])
– user10853036
Jan 7 at 21:41
add a comment |
Something that hasn't been mentioned yet but which can give you a square output is to simply set the size of the figure using figsize=(x,y)
in constructing the figure. For example,
import matplotlib.pyplot as plt
import numpy as np
import random
x = np.arange(0, 10, 0.2)
y = np.zeros((len(x)))
for ii in range(len(x)):
y[ii] = random.random()*20
fig = plt.figure(figsize=(5,5), dpi=150)
plt.scatter(x, y, label="Data", marker="+")
plt.title("Title")
plt.legend(bbox_to_anchor=(1.01, 0.5), loc="center left", borderaxespad=0.)
plt.show()
Important note This method will not produce a square plot if plt.tight_layout()
is also used - doing so will always squeeze the ticklabels and anything else that is added (title, legend, axis labels, etc) into the region created by figsize
thereby reducing the aspect ratio below 1:1.
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to useset_aspect
where this does not (the figure size can be set withrcParams
instead of in constructing the figure).
– William Miller
Jan 8 at 16:55
1
If you don't have a handle in pyplot you may always doplt.gca().set_something
.
– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
add a comment |
Something that hasn't been mentioned yet but which can give you a square output is to simply set the size of the figure using figsize=(x,y)
in constructing the figure. For example,
import matplotlib.pyplot as plt
import numpy as np
import random
x = np.arange(0, 10, 0.2)
y = np.zeros((len(x)))
for ii in range(len(x)):
y[ii] = random.random()*20
fig = plt.figure(figsize=(5,5), dpi=150)
plt.scatter(x, y, label="Data", marker="+")
plt.title("Title")
plt.legend(bbox_to_anchor=(1.01, 0.5), loc="center left", borderaxespad=0.)
plt.show()
Important note This method will not produce a square plot if plt.tight_layout()
is also used - doing so will always squeeze the ticklabels and anything else that is added (title, legend, axis labels, etc) into the region created by figsize
thereby reducing the aspect ratio below 1:1.
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to useset_aspect
where this does not (the figure size can be set withrcParams
instead of in constructing the figure).
– William Miller
Jan 8 at 16:55
1
If you don't have a handle in pyplot you may always doplt.gca().set_something
.
– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
add a comment |
Something that hasn't been mentioned yet but which can give you a square output is to simply set the size of the figure using figsize=(x,y)
in constructing the figure. For example,
import matplotlib.pyplot as plt
import numpy as np
import random
x = np.arange(0, 10, 0.2)
y = np.zeros((len(x)))
for ii in range(len(x)):
y[ii] = random.random()*20
fig = plt.figure(figsize=(5,5), dpi=150)
plt.scatter(x, y, label="Data", marker="+")
plt.title("Title")
plt.legend(bbox_to_anchor=(1.01, 0.5), loc="center left", borderaxespad=0.)
plt.show()
Important note This method will not produce a square plot if plt.tight_layout()
is also used - doing so will always squeeze the ticklabels and anything else that is added (title, legend, axis labels, etc) into the region created by figsize
thereby reducing the aspect ratio below 1:1.
Something that hasn't been mentioned yet but which can give you a square output is to simply set the size of the figure using figsize=(x,y)
in constructing the figure. For example,
import matplotlib.pyplot as plt
import numpy as np
import random
x = np.arange(0, 10, 0.2)
y = np.zeros((len(x)))
for ii in range(len(x)):
y[ii] = random.random()*20
fig = plt.figure(figsize=(5,5), dpi=150)
plt.scatter(x, y, label="Data", marker="+")
plt.title("Title")
plt.legend(bbox_to_anchor=(1.01, 0.5), loc="center left", borderaxespad=0.)
plt.show()
Important note This method will not produce a square plot if plt.tight_layout()
is also used - doing so will always squeeze the ticklabels and anything else that is added (title, legend, axis labels, etc) into the region created by figsize
thereby reducing the aspect ratio below 1:1.
edited Jan 8 at 16:48
answered Jan 8 at 0:38
William MillerWilliam Miller
1
1
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to useset_aspect
where this does not (the figure size can be set withrcParams
instead of in constructing the figure).
– William Miller
Jan 8 at 16:55
1
If you don't have a handle in pyplot you may always doplt.gca().set_something
.
– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
add a comment |
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to useset_aspect
where this does not (the figure size can be set withrcParams
instead of in constructing the figure).
– William Miller
Jan 8 at 16:55
1
If you don't have a handle in pyplot you may always doplt.gca().set_something
.
– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
Did you notice that this does not actually produce a square axes? Only because the figure is square, doesn't mean the axes is as well.
– ImportanceOfBeingErnest
Jan 8 at 14:45
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to use
set_aspect
where this does not (the figure size can be set with rcParams
instead of in constructing the figure).– William Miller
Jan 8 at 16:55
@ImportanceOfBeingErnest yes I do realize that, but it is within 30 pixels even for figures up to 1200x1200 so I thought it was appropriate to mention, given that the question seemed to be concerning the look of the plot not whether it is square down to the pixel when measured. Certainly setting the aspect ratio explicitly as in your answer is more robust, though it does require an axis handle on which to use
set_aspect
where this does not (the figure size can be set with rcParams
instead of in constructing the figure).– William Miller
Jan 8 at 16:55
1
1
If you don't have a handle in pyplot you may always do
plt.gca().set_something
.– ImportanceOfBeingErnest
Jan 8 at 17:24
If you don't have a handle in pyplot you may always do
plt.gca().set_something
.– ImportanceOfBeingErnest
Jan 8 at 17:24
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
@ImportanceOfBeingErnest That’s a good note, I did not actually know that. I do think that setting the aspect ratio explicitly as in your answer is more elegant
– William Miller
Jan 8 at 20:33
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54081694%2fhow-to-make-sure-that-both-x-and-y-axes-of-plot-are-of-equal-sizes%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown