2

I have 2 points (a vector of size 8) and 3 different bitwise operation (And, OR, XOR) I mapped each point and the result of bitwise operations on the 2D plot. I want to show each points real data itself and the result of operation beside my plot (right of the plot or above the plot (wherever is possible or it's better)) so later when I want to analysis the result I can read data value easily. right now my image is like this, and you can see the legend is cut off and I have no place outside of plot to write anything:

enter image description here

The text I want to show outside of my plot:

P1  P2  And Or  Xor     
0   1   0   1   1   
0   0   0   0   0   
0   0   0   0   0   
0   0   0   0   0   
1   1   1   1   0   
1   1   1   1   0   
1   1   1   1   0   
1   1   1   1   0   

The code I am using :

import numpy as np
import pylab as pl
fig = pl.figure()
ax = fig.add_subplot(111)
            
ax.plot(p1x, p1y, 'bx', label='Point 1', alpha=.55, markersize=30)
ax.plot(p2x, p2y, 'r+', label='Point 2', alpha=.55, markersize=30)
ax.plot(Andx, Andy, 'go', label='AND', alpha=.45, markersize=10) 
ax.plot(Orx, Ory, 'y<', label='OR', alpha=.45, markersize=10) 
ax.plot(Xorx, Xory, 'ks',  label='XOR', alpha=.45, markersize=10) 
ax.set_title('Bitwise Operation')
ax.set_xlabel('axis X')
ax.set_ylabel('axis Y')
ax.axis([-0.05, 1.05, -0.05, 1.05])
pl.legend(loc='lower left', bbox_to_anchor=(1.02, 0), borderaxespad=0)
pl.show()
Am1rr3zA
  • 7,115
  • 18
  • 83
  • 125

2 Answers2

7

You can use add_axes to directly control the size and location of your axes and then use text to add the text you want. For example:

import numpy as np
import pylab as pl
fig = pl.figure()

ax =  fig.add_axes([0.1, 0.2, 0.4, 0.4])

ax.plot(.1, .2, 'bx', label='Point 1', alpha=.55, markersize=30)
ax.plot(.2, .1, 'r+', label='Point 2', alpha=.55, markersize=30)
ax.plot(.3, .2, 'go', label='AND', alpha=.45, markersize=10) 
ax.plot(.1, .3, 'y<', label='OR', alpha=.45, markersize=10) 
ax.plot(.1, .2, 'ks',  label='XOR', alpha=.45, markersize=10) 
ax.set_title('Bitwise Operation')
ax.set_xlabel('axis X')
ax.set_ylabel('axis Y')
ax.axis([-0.05, 1.05, -0.05, 1.05])
pl.legend(loc='lower left', bbox_to_anchor=(1.02, 0), borderaxespad=0)

data = ('P1  P2  And Or  Xor \n'
'0   1   0   1   1   \n'
'0   0   0   0   0   \n'
'0   0   0   0   0   \n'
'0   0   0   0   0   \n'
'1   1   1   1   0   \n'
'1   1   1   1   0   \n'
'1   1   1   1   0   \n'
'1   1   1   1   0   \n')

pl.text(1.75,0,data)
pl.show()

plot with text outside of axis

Molly
  • 13,240
  • 4
  • 44
  • 45
  • 2
    Also see http://stackoverflow.com/questions/18769870/matplotlib-wxpython-not-sizing-correctly-with-legend/18771068#18771068 for some code that will auto-resize everything to fit – tacaswell Nov 11 '13 at 05:49
1

In my case, I had to display certain extra data (parameters of the graph) in a text box, something similar to 'Text outside area' in Matlab. After some trial and errors, I stumbled upon this nicely written answer here.

The Postprocessing part of the answer is really helpful. plt.subplots_adjust gives the programmer a better control than the plt.tight_layout

talekeDskobeDa
  • 372
  • 2
  • 13