On Sunday, April 3, 2016 at 2:35:58 PM UTC-7, Oscar Benjamin wrote:
On 3 Apr 2016 22:21, "Muhammad Ali" <muhammadaliask...@gmail.com> wrote:
>
> How do I convert/change/modify python script so that my data could be
extracted according to python script and at the end it generates another
single extracted data file instead of displaying/showing some graph? So
that, I can manually plot the newly generated file (after data extraction)
by some other software like origin.
It depends what you're computing and what format origin expects the data to
be in. Presumably it can use CSV files so take a look at the CSV module
which can write these.
(You'll get better answers to a question like this if you show us some code
and ask a specific question about how to change it.)
--
Oscar
How could the python script be modified to generate data file rather than
display a plot by using matplotlib?
def make_plot(plot):
indent = plot.plot_options.indent
args = plot.plot_options.args
# Creating the plot
print ('Generating the plot...')
fig = plt.figure(figsize=(plot.fig_width_inches,plot.fig_height_inches))
ax = fig.add_subplot(111)
# Defining the color schemes.
print (indent + '>>> Using the "' + plot.cmap_name + '" colormap.')
if(plot.plot_options.using_default_cmap and not args.running_from_GUI):
print (2 * indent + 'Tip: You can try different colormaps by either:')
print (2 * indent + ' * Running the plot tool with the option
-icmap n, ' \
'with n in the range from 0 to', len(plot.plot_options.cmaps) -
1)
print (2 * indent + ' * Running the plot tool with the option "-cmap
cmap_name".')
print (2 * indent + '> Take a look at')
print (4 * indent +
'<http://matplotlib.org/examples/color/colormaps_reference.html>')
print (2 * indent + ' for a list of colormaps, or run')
print (4 * indent + '"./plot_unfolded_EBS_BandUP.py --help".')
# Building the countour plot from the read data
# Defining the (ki,Ej) grid.
if(args.interpolation is not None):
ki = np.linspace(plot.kmin, plot.kmax, 2 * len(set(plot.KptsCoords)) +
1, endpoint=True)
Ei = np.arange(plot.emin, plot.emax + plot.dE_for_hist2d,
plot.dE_for_hist2d)
# Interpolating
grid_freq = griddata((plot.KptsCoords, plot.energies), plot.delta_Ns,
(ki[None,:], Ei[:,None]),
method=args.interpolation, fill_value=0.0)
else:
ki = np.unique(np.clip(plot.KptsCoords, plot.kmin, plot.kmax))
Ei = np.unique(np.clip(plot.energies, plot.emin, plot.emax))
grid_freq = griddata((plot.KptsCoords, plot.energies), plot.delta_Ns,
(ki[None,:], Ei[:,None]),
method='nearest', fill_value=0.0)
if(not args.skip_grid_freq_clip):
grid_freq = grid_freq.clip(0.0) # Values smaller than zero are just
noise.
# Normalizing and building the countour plot
manually_normalize_colorbar_min_and_maxval = False
if((args.maxval_for_colorbar is not None) or (args.minval_for_colorbar is
not None)):
manually_normalize_colorbar_min_and_maxval = True
args.disable_auto_round_vmin_and_vmax = True
maxval_for_colorbar = args.maxval_for_colorbar
minval_for_colorbar = args.minval_for_colorbar
else:
if not args.disable_auto_round_vmin_and_vmax:
minval_for_colorbar = float(round(np.min(grid_freq)))
maxval_for_colorbar = float(round(np.max(grid_freq)))
args.round_cb = 0
if(manually_normalize_colorbar_min_and_maxval or not
args.disable_auto_round_vmin_and_vmax):
modified_vmin_or_vmax = False
if not args.disable_auto_round_vmin_and_vmax and not
args.running_from_GUI:
print (plot.indent + '* Automatically renormalizing color scale '\
'(you can disable this with the option
--disable_auto_round_vmin_and_vmax):')
if manually_normalize_colorbar_min_and_maxval:
print (plot.indent + '* Manually renormalizing color scale')
if(minval_for_colorbar is not None):
previous_vmin = np.min(grid_freq)
if(abs(previous_vmin - minval_for_colorbar) >= 0.1):
modified_vmin_or_vmax = True
print (2 * indent + 'Previous vmin = %.1f, new vmin = %.1f' %
(previous_vmin,
minval_for_colorbar))
else:
minval_for_colorbar = np.min(grid_freq)
if(maxval_for_colorbar is not None):
previous_vmax = np.max(grid_freq)
if(abs(previous_vmax - maxval_for_colorbar) >= 0.1):
modified_vmin_or_vmax = True
print (2 * indent + 'Previous vmax = %.1f, new vmax = %.1f' %
(previous_vmax,
maxval_for_colorbar))
else:
maxval_for_colorbar = np.max(grid_freq)
if(modified_vmin_or_vmax):
print (2 * indent + 'The previous vmin and vmax might be slightly
different from '
'the min and max delta_Ns '
'due to the interpolation scheme used for the
plot.')
# values > vmax will be set to vmax, and #<vmin will be set to vmin
grid_freq = grid_freq.clip(minval_for_colorbar, maxval_for_colorbar)
v = np.linspace(minval_for_colorbar, maxval_for_colorbar,
args.n_levels, endpoint=True)
else:
v = np.linspace(np.min(grid_freq), np.max(grid_freq), args.n_levels,
endpoint=True)
print (indent + '* Drawing contour plot...')
print (2 * indent + '> Using %i color levels. Use the option "--n_levels"
to choose a different number.' %args.n_levels)
image = ax.contourf(ki, Ei, grid_freq, levels=v, cmap=plot.cmap)
plot_spin_proj_requested = args.plot_spin_perp or args.plot_spin_para or
args.plot_sigma_x or args.plot_sigma_y or args.plot_sigma_z
if(plot_spin_proj_requested and plot.spin_projections is not None):
print (indent + '* Drawing spin projection info')
cmap_for_spin_plot = [plt.cm.bwr, plt.cm.RdBu, plt.cm.seismic_r][0]
if(args.clip_spin is None):
vmin_spin = np.min(plot.spin_projections)
vmax_spin = np.max(plot.spin_projections)
else:
vmax_spin = abs(args.clip_spin)
vmin_spin = -1.0 * abs(args.clip_spin)
print (2 * indent + '* New maxval for spin: %.2f' % vmax_spin)
print (2 * indent + '* New minval for spin: %.2f' % vmin_spin)
spin_projections = np.clip(plot.spin_projections, vmin_spin, vmax_spin)
grid_freq_spin = griddata((plot.KptsCoords, plot.energies),
spin_projections, (ki[None,:], Ei[:,None]),
method='nearest', fill_value=0.0)
k_for_scatter = []
E_for_scatter = []
spin_projections_for_scatter = []
for iener in range(len(Ei)):
for ikpt in range(len(ki)):
if(abs(grid_freq_spin[iener, ikpt]) > 1E-3):
k_for_scatter.append(ki[ikpt])
E_for_scatter.append(Ei[iener])
spin_projections_for_scatter.append(grid_freq_spin[iener,
ikpt])
if(spin_projections_for_scatter):
if(args.spin_marker=='o'):
image2 = ax.scatter(k_for_scatter, E_for_scatter, marker='o',
s=[10.0 * abs(item) for item in
spin_projections_for_scatter],
c=spin_projections_for_scatter,
cmap=cmap_for_spin_plot)
else:
image2 = ax.scatter(k_for_scatter, E_for_scatter, marker='_',
s=[500.0 * (ki[1] - ki[0]) for item in
spin_projections_for_scatter],
linewidth=[100.0 * plot.dE_for_hist2d *
(item ** 2) for item in spin_projections_for_scatter],
c=spin_projections_for_scatter,
cmap=cmap_for_spin_plot)
else:
print (2 * indent + '* The abs values of the spin projections were
all < 1E-3.')
#Preparing the plot
ax.set_xlim(plot.kmin, plot.kmax)
ax.set_ylim(plot.emin, plot.emax)
ax.set_title(plot.title, fontsize=plot.title_size)
ax.set_ylabel(plot.y_axis_label, fontsize=plot.yaxis_labels_size)
plt.yticks(fontsize=plot.tick_marks_size)
# Fermi energy line
show_E_f = not args.no_ef
if(show_E_f and plot.E_f >= plot.emin and plot.E_f <= plot.emax):
E_f_line = plt.axhline(y=plot.E_f, c=plot.color_E_f_line(image),
linestyle=plot.line_style_E_f, lw=plot.line_width_E_f)
# High symmetry points lines
if(plot.pos_high_symm_points):
x_tiks_positions = [kx for kx in plot.pos_high_symm_points if kx - plot.kmax
<= 1E-2 and kx >= plot.kmin]
if(args.no_symm_labels):
x_tiks_labels = []
else:
x_tiks_labels = [plot.labels_high_symm_lines[i] for i in
range(len(plot.labels_high_symm_lines)) if
plot.pos_high_symm_points[i] in x_tiks_positions]
x_tiks_labels = [xlabel for xlabel in x_tiks_labels if xlabel]
if x_tiks_labels:
print (indent + '* K-point labels read from the "' + args.kpoints_file +
'" file:')
for ilabel in range(len(x_tiks_labels)):
print(2 * indent + "k = {:9.5f}".format(x_tiks_positions[ilabel])
+ ', label =',\
x_tiks_labels[ilabel])
plt.xticks(x_tiks_positions, x_tiks_labels,
fontsize=plot.tick_marks_size)
else:
plot.x_axis_label = '$k \hspace{0.25} (\AA^{-1})$'
plt.locator_params(axis = 'x', nbins = 5)
ax.set_xlabel(plot.x_axis_label, fontsize=plot.xaxis_labels_size)
plt.xticks(fontsize=plot.tick_marks_size)
ax.tick_params(axis='x', pad=10)
# Drawing vertical lines at the positions of the high-symmetry points
if(not args.no_symm_lines):
for line_position in [pos for pos in plot.pos_high_symm_points if
float(round(pos, 3)) > float(round(plot.kmin, 3)) and
float(round(pos, 3)) < float(round(plot.kmax, 3))]:
hs_lines = plt.axvline(x=line_position,
c=plot.color_high_symm_lines(image), linestyle=plot.line_style_high_symm_points,
lw=plot.line_width_high_symm_points)
# Color bar
show_colorbar = not args.no_cb
if show_colorbar:
if plot.cb_orientation=='vertical':
cb_pad=0.005
else:
cb_pad=0.06
if(not x_tiks_labels):
cb_pad += 0.08 # To prevent the cb from overlapping with the
numbers.
cb_yticks = np.arange(int(image.norm.vmin), int(image.norm.vmax) + 1,
1)
cb_ytick_labels = [round(item,abs(args.round_cb)) for item in
cb_yticks]
cb = plt.colorbar(image, ax=ax, ticks=cb_yticks,
orientation=plot.cb_orientation, pad=cb_pad)
cb.set_ticklabels(cb_ytick_labels)
cb.ax.tick_params(labelsize=plot.colorbar_tick_marks_size)
color_bar_label = None
if args.cb_label:
color_bar_label = ('$Color scale: \hspace{0.5} \delta N(\\vec{k};
' +
'\hspace{0.25} \epsilon)$ ')
if args.cb_label_full:
color_bar_label = ('$Colors cale: \hspace{0.5} \delta N(\\vec{k};
' +
'\hspace{0.25} \epsilon);$ '+
'$\delta\epsilon=' +
round(1000.0*plot.dE_for_hist2d,0) +
'\\hspace{0.25} meV.$')
if plot.cb_orientation=='vertical':
cb_label_rotation = 90
else:
cb_label_rotation = 0
if color_bar_label:
cb.ax.text(plot.offset_x_text_colorbar,
plot.offset_y_text_colorbar,
color_bar_label, rotation=cb_label_rotation,
ha='center',
va='center', fontsize=plot.colorbar_label_size)
# Saving/showing the results
plt.tick_params(which='both', bottom='off', top='off', left='off',
right='off',
labelbottom='on')
default_out_basename = "_".join([splitext(basename(args.input_file))[0],
'E_from', str(plot.emin), 'to',
str(plot.emax), 'eV_dE',
str(plot.dE_for_hist2d), 'eV'])
if(args.save):
if(args.output_file is None):
args.output_file = abspath(default_out_basename + '.' +
args.file_format)
print ('Savig figure to file "%s" ...' % args.output_file)
if(args.fig_resolution[0].upper() == 'H'):
print (indent + '* High-resolution figure (600 dpi).')
fig_resolution_in_dpi = 600
elif (args.fig_resolution[0].upper() == 'M'):
print (indent + '* Medium-resolution figure (300 dpi).')
fig_resolution_in_dpi = 300
elif (args.fig_resolution[0].upper() == 'L'):
print (indent + '* Low-resolution figure (100 dpi).')
fig_resolution_in_dpi = 100
else:
print (indent + 'Assuming medium-resolution (300 dpi) for the
figure.')
fig_resolution_in_dpi = 300
plt.savefig(args.output_file, dpi=fig_resolution_in_dpi,
bbox_inches='tight')
print (indent + '* Done saving figure (%s).' % args.output_file)
if args.saveshow:
print ('Opening saved figure (%s)...' % default_out_basename)
# 'xdg-open' might fail to find the defualt program in some systems
# For such cases, one can try to use other alternatives (just add more
to the list below)
image_viewer_list = ['xdg-open', 'eog']
for image_viewer in image_viewer_list:
open_saved_fig = Popen([image_viewer, args.output_file],
stdout=PIPE, stderr=PIPE)
std_out, std_err = open_saved_fig.communicate()
success_opening_file = std_err.strip() == ''
if(success_opening_file):
break
if(not success_opening_file):
print (indent + '* Failed (%s): no image viewer detected.' %
default_out_basename)
if args.show:
print ('Showing figure (%s)...' % default_out_basename)
plt.show()
print (indent + '* Done showing figure (%s).' % default_out_basename)
if __name__ == '__main__':
print_opening_message()
plot_options = BandUpPlotOptions()
plot = BandUpPlot(plot_options)
make_plot(plot)
sys.exit(0)