I tried to add a secondary x axis to the top of the plot as a nm scale which can be obtained from the pixels using a correlation function like, nm = 495.04-x*0.059, is there any idea how to do that, I tried many times but failed... thanks
code:
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
data = pd.read_csv('BS3053_BFI.dat', sep='.', delimiter='\t',engine = 'python', skiprows=0, header=None)
data = pd.DataFrame(data).transpose()
pixel_x = data.shape[1] # pixels in x direction
pixel_y = data.shape[0] # pixels in y direction
fig = plt.figure()
ax1 = fig.add_subplot(111)
im = ax1.imshow(data, cmap=plt.cm.gnuplot2,extent=[0,1024,257,0],interpolation=None)# ,,
ax1.set_xlabel('Pixel', fontsize=12)[![enter image description here][1]][1]
ax1.set_ylabel('CCD height', fontsize=12)
ax1.set_ylim([0, 257])
ax1.set_yticklabels([])
ax1.tick_params(direction='in',axis='both', length=.1)
ax1.text(0,259, r'BS3053, Slit width 70 $\mu m$', fontsize=10)
# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax1)
cax = divider.append_axes("right", size="4%", pad=0.05)
plt.colorbar(im, cax=cax);
plt.show()
Some times, a simple way of thinking could make your life easy... it is solved.
'''
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.ticker import AutoLocator
data = pd.read_csv('BS2350_slit_60um.dat', sep='.', delimiter='\t',engine = 'python', skiprows=0, header=None)
data = pd.DataFrame(data).transpose()
pixel_x = data.shape[1] # pixels in x direction
pixel_y = data.shape[0] # pixels in y direction
fig = plt.figure(figsize=(6.4, 6.4))
ax = fig.add_subplot(111)
ax.set_aspect('auto')
im = ax.imshow(data, cmap=plt.cm.gnuplot2,aspect='equal',extent=[0,1024,257,0],interpolation=None)# ,,
ax.set_xlabel('Pixel', fontsize=12)
ax.set_ylabel('CCD height', fontsize=12)
ax.set_ylim([0, 257])
#ax.set_xticklabels([])
ax.set_yticklabels([])
ax.tick_params(direction='in',axis='both', length=.1)
#ax.text(0,259, r'slit width, 40 $\mu m$, minimum slit height', fontsize=10)
#print(data[1][:])
pixel = np.linspace(0,1024)
def pixelTonm(pixel):
nm = 495.04-pixel*0.059
return nm
def nmTopixel(nm):
pixel = (495.04-nm) / 0.059
return pixel
ax2 = ax.secondary_xaxis('top', functions=(pixelTonm,nmTopixel))
ax2.set_xlabel('Wavelength / nm', fontsize=12)
ax2.tick_params(direction='out',axis='x', length=2)
# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="2.5%", pad=0.05)
plt.colorbar(im, cax=cax);
plt.savefig('slit_40um_rf_.jpg') [![Afert adding the second axis on the top, and how it looks like][1]][1]
plt.show()
'''