Python - time frequency spectrogram
The idea of a spectogram is to split your signal into a number of blocks or frames, which are potentially overlapping. After windowing, an FFT is calculated per frame. The output of these FFTs are collected as column vectors in your graph. Thus, the x-axis is related to time and the y-axis is related to frequency. Since the FFT of a real-valued signal is symmetric, only half the frequencies have to be plotted. Therefore, the y-axis goes from 0 to Fs/2=128. 

Since you have chosen the FFT length (NFFT=256) equal to the lenght of your signal, you have only one full frame of data. 

Potential solutions are to reduce your FFT length NFFT or increase your data length. For now, the easiest way seems to be in reducing NFFT. Note however, that you also need to adjust noverlap in that case. A widely used amount of overlap is NFFT/2. 

Example:
The following command will give you a spectogram.

specgram(data, NFFT=64, Fs=256, noverlap=32)


Alternative implementation:

Nfft=64
specgram(data, NFFT=Nfft, Fs=256, noverlap=Nfft/2)


The FFT length parameter NFFT leads to a tradeoff between time and frequency resolution.

EDIT To answer additional questions in the comments.

From the documentation in 
[http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.specgram]:


  Returns the tuple (spectrum, freqs, t, im):
  
  spectrum: 2-D array
  
  columns are the periodograms of successive segments
  
  freqs: 1-D array
  
  The frequencies corresponding to the rows in spectrum
  
  t: 1-D array
  
  The times corresponding to midpoints of segments (i.e the columns in >spectrum)
  
  im: instance of class AxesImage
  
  The image created by imshow containing the spectrogram


Thus, the first element in the returned tuple contains the power values.