tupdate histogram to log, plot creep snapshots in loop - sphere - GPU-based 3D … | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit df5ef21559c8d9f76c721a15950a144290b3e4f8 | |
parent 14fb2bf075a6836438322eb5cfb2b70536a5c045 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Mon, 18 May 2015 13:17:31 +0200 | |
update histogram to log, plot creep snapshots in loop | |
Diffstat: | |
M python/halfshear-darcy-creep-dynam… | 475 +++++++++------------------… | |
M python/sphere.py | 1 + | |
2 files changed, 139 insertions(+), 337 deletions(-) | |
--- | |
diff --git a/python/halfshear-darcy-creep-dynamics.py b/python/halfshear-darcy-… | |
t@@ -29,6 +29,7 @@ matplotlib.rc('grid', linestyle=':', linewidth=0.2) | |
outformat='pdf' | |
+plotContacts=False | |
#sids = ['halfshear-darcy-sigma0=10000.0-k_c=2e-16-mu=2.08e-07-ss=2000.0-A=400… | |
sids = ['halfshear-darcy-sigma0=10000.0-k_c=2e-16-mu=2.08e-07-ss=2000.0-A=4375… | |
t@@ -59,6 +60,20 @@ f_n_max = 50 # for force chain plots | |
N = numpy.zeros_like(steps, dtype=numpy.float64) | |
t = numpy.zeros_like(steps, dtype=numpy.float64) | |
+scatter=False | |
+ | |
+# insert plot positions | |
+Lx=[.17, .37, .65] | |
+Ly=[.3, .7, .4] | |
+dx=.23; dy=.23 | |
+xytext_x=[Lx[0]+.15*dx, Lx[1]+.6*dx, Lx[2]+1.15*dx] | |
+xytext_y=[Ly[0]+dy+.07, Ly[1]+.15, .2] | |
+fc_x = [Lx[0]-.007, Lx[1]+dx+.08, Lx[2]-.007] | |
+fc_y = [Ly[0]-.07*dy, Ly[1]+.035, Ly[2]-.7*dy] | |
+fc_dx = [dx, dx, dx] | |
+fc_dy = [dy*.7, dy*.7, dy*.7] | |
+ | |
+ | |
s=0 | |
for sid in sids: | |
t@@ -77,15 +92,14 @@ for sid in sids: | |
N[i] = sim.currentNormalStress('defined') | |
t[i] = sim.currentTime() | |
- ''' | |
- outfolder='../img_out/' + sim.id() + '/' | |
- if not os.path.exists(outfolder): | |
- os.makedirs(outfolder) | |
- sim.plotContacts(outfolder=outfolder, | |
- alpha=0.9, | |
- lower_limit=lower_limit, | |
- upper_limit=upper_limit) | |
- ''' | |
+ if plotContacts: | |
+ outfolder='../img_out/' + sim.id() + '/' | |
+ if not os.path.exists(outfolder): | |
+ os.makedirs(outfolder) | |
+ sim.plotContacts(outfolder=outfolder, | |
+ alpha=0.9, | |
+ lower_limit=lower_limit, | |
+ upper_limit=upper_limit) | |
if (step == plotsteps).any(): | |
#contactdata.append(sim.plotContacts(return_data=True)) | |
t@@ -150,338 +164,125 @@ for sid in sids: | |
ax1.locator_params(axis='y', nbins=4) | |
## Contact scatter plots | |
- dx=.23; dy=.23 | |
# Scatter plot 1 | |
- sc=0 | |
- Lx=.17; Ly=.3; | |
- #xytext=(Lx+.5*dx, Ly+.5*dy) | |
- xytext=(Lx+.15*dx, Ly+dy+.07) | |
- xy=(ts[0]*scalingfactor, Ns[0]/1000.) | |
- #print xytext | |
- #print xy | |
- ax1.annotate('', | |
- xytext=xytext, textcoords='axes fraction', | |
- xy=xy, xycoords='data', | |
- arrowprops=dict(arrowstyle='->', connectionstyle='arc3')) | |
- | |
- axsc1 = fig.add_axes([Lx, Ly, dx, dy], polar=True) | |
- cs = axsc1.scatter(strikelists[sc], 90. - diplists[sc], marker='o', | |
- c=forcemagnitudes[sc], | |
- s=forcemagnitudes[sc]/f_n_maxs[sc]*5., | |
- alpha=alphas[sc], | |
- edgecolors='none', | |
- vmin=f_n_maxs[sc]*lower_limit, | |
- vmax=f_n_maxs[sc]*upper_limit, | |
- cmap=matplotlib.cm.get_cmap('afmhot_r'))#, | |
- #norm=matplotlib.colors.LogNorm()) | |
- # tick locations | |
- #thetaticks = numpy.arange(0,360,90) | |
- # set ticklabels location at 1.3 times the axes' radius | |
- #ax.set_thetagrids(thetaticks, frac=1.3) | |
- axsc1.set_xticklabels([]) | |
- axsc1.set_yticklabels([]) | |
- | |
- axsc1.set_title('\\textbf{1. Slow creep}', fontsize=7) | |
- if upper_limit < 1.0: | |
- cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04) | |
- else: | |
- cbar = plt.colorbar(cs, fraction=0.045, pad=0.04) | |
- #cbar.set_label('$||\\boldsymbol{f}_n||$') | |
- cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]') | |
- cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4) | |
- cbar.update_ticks() | |
- | |
- # plot defined max compressive stress from tau/N ratio | |
- axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='+', c='none', edgecolor='red', s=100) | |
- axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='o', c='none', edgecolor='red', s=100) | |
- ''' | |
- ax.sc1scatter(0., # actual stress | |
- numpy.degrees(numpy.arctan( | |
- self.shearStress('effective')/ | |
- self.currentNormalStress('effective'))), | |
- marker='+', color='blue', s=300) | |
- ''' | |
- | |
- axsc1.set_rmax(90) | |
- axsc1.set_rticks([]) | |
- #axsc1.grid(False) | |
- | |
- # force chain plot | |
- | |
- axfc1 = fig.add_axes([Lx-0.007, Ly-0.7*dy, dx, dy*0.7]) | |
- | |
- data = datalists[sc] | |
- | |
- # find the max. value of the normal force | |
- #f_n_max = numpy.amax(data[:,6]) | |
- | |
- # specify the lower limit of force chains to do statistics on | |
- f_n_lim = lower_limit * f_n_max | |
- | |
- # find the indexes of these contacts | |
- I = numpy.nonzero(data[:,6] >= f_n_lim) | |
- | |
- #color = matplotlib.cm.spectral(data[:,6]/f_n_max) | |
- for i in I[0]: | |
- | |
- x1 = data[i,0] | |
- #y1 = data[i,1] | |
- z1 = data[i,2] | |
- x2 = data[i,3] | |
- #y2 = data[i,4] | |
- z2 = data[i,5] | |
- f_n = data[i,6] | |
- | |
- lw_max = 1.0 | |
- if f_n >= f_n_max: | |
- lw = lw_max | |
- else: | |
- lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max | |
- | |
- #print lw | |
- axfc1.plot([x1,x2], [z1,z2], '-k', linewidth=lw) | |
- #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes… | |
- #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color) | |
+ for sc in range(len(Lx)): | |
+ xy=(ts[sc]*scalingfactor, Ns[sc]/1000.) | |
+ #print xytext | |
+ #print xy | |
+ ax1.annotate('', | |
+ xytext=(xytext_x[sc], xytext_y[sc]), textcoords='axes fra… | |
+ xy=xy, xycoords='data', | |
+ arrowprops=dict(arrowstyle='->', connectionstyle='arc3')) | |
+ | |
+ if scatter: | |
+ axsc1 = fig.add_axes([Lx[sc], Ly[sc], dx, dy], polar=True) | |
+ cs = axsc1.scatter(strikelists[sc], 90. - diplists[sc], marker='o', | |
+ c=forcemagnitudes[sc], | |
+ s=forcemagnitudes[sc]/f_n_maxs[sc]*5., | |
+ alpha=alphas[sc], | |
+ edgecolors='none', | |
+ vmin=f_n_maxs[sc]*lower_limit, | |
+ vmax=f_n_maxs[sc]*upper_limit, | |
+ cmap=matplotlib.cm.get_cmap('afmhot_r'))#, | |
+ #norm=matplotlib.colors.LogNorm()) | |
+ # tick locations | |
+ #thetaticks = numpy.arange(0,360,90) | |
+ # set ticklabels location at 1.3 times the axes' radius | |
+ #ax.set_thetagrids(thetaticks, frac=1.3) | |
+ axsc1.set_xticklabels([]) | |
+ axsc1.set_yticklabels([]) | |
+ | |
+ if sc == 0: | |
+ title = '1. Slow creep' | |
+ elif sc == 1: | |
+ title = '2. Fast creep' | |
+ elif sc == 2: | |
+ title = '3. Slip' | |
+ else: | |
+ title = 'Unknown' | |
+ axsc1.set_title('\\textbf{' + title + '}', fontsize=7) | |
+ if upper_limit < 1.0: | |
+ cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04) | |
+ else: | |
+ cbar = plt.colorbar(cs, fraction=0.045, pad=0.04) | |
+ #cbar.set_label('$||\\boldsymbol{f}_n||$') | |
+ cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]') | |
+ cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4) | |
+ cbar.update_ticks() | |
+ | |
+ # plot defined max compressive stress from tau/N ratio | |
+ axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
+ marker='+', c='none', edgecolor='red', s=100) | |
+ axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
+ marker='o', c='none', edgecolor='red', s=100) | |
+ ''' | |
+ ax.sc1scatter(0., # actual stress | |
+ numpy.degrees(numpy.arctan( | |
+ self.shearStress('effective')/ | |
+ self.currentNormalStress('effective'))), | |
+ marker='+', color='blue', s=300) | |
+ ''' | |
+ | |
+ axsc1.set_rmax(90) | |
+ axsc1.set_rticks([]) | |
+ #axsc1.grid(False) | |
- axfc1.spines['right'].set_visible(False) | |
- axfc1.spines['left'].set_visible(False) | |
- # Only show ticks on the left and bottom spines | |
- axfc1.xaxis.set_ticks_position('none') | |
- axfc1.yaxis.set_ticks_position('none') | |
- axfc1.set_xticklabels([]) | |
- axfc1.set_yticklabels([]) | |
- axfc1.set_xlim([numpy.min(data[I[0],0]), numpy.max(data[I[0],0])]) | |
- axfc1.set_ylim([numpy.min(data[I[0],2]), numpy.max(data[I[0],2])]) | |
- axfc1.set_aspect('equal') | |
- | |
- | |
- | |
- # Scatter plot 2 | |
- sc=1 | |
- Lx=.37; Ly=.7; | |
- #xytext=(Lx+.5*dx, Ly+.5*dy) | |
- #xytext=(Lx+.5*dx, Ly+.05) | |
- xytext=(Lx+.6*dx, Ly+.15) | |
- xy=(ts[sc]*scalingfactor, Ns[sc]/1000.) | |
- #print xytext | |
- #print xy | |
- ax1.annotate('', | |
- xytext=xytext, textcoords='axes fraction', | |
- xy=xy, xycoords='data', | |
- arrowprops=dict(arrowstyle='->', connectionstyle='arc3')) | |
- | |
- axsc2 = fig.add_axes([Lx, Ly, dx, dy], polar=True) | |
- | |
- cs = axsc2.scatter(strikelists[sc], 90. - diplists[sc], marker='o', | |
- c=forcemagnitudes[sc], | |
- s=forcemagnitudes[sc]/f_n_max*5., | |
- alpha=alphas[sc], | |
- edgecolors='none', | |
- vmin=f_n_maxs[sc]*lower_limit, | |
- vmax=f_n_maxs[sc]*upper_limit, | |
- cmap=matplotlib.cm.get_cmap('afmhot_r'))#, | |
- #norm=matplotlib.colors.LogNorm()) | |
- # tick locations | |
- #thetaticks = numpy.arange(0,360,90) | |
- # set ticklabels location at 1.3 times the axes' radius | |
- #ax.set_thetagrids(thetaticks, frac=1.3) | |
- axsc2.set_xticklabels([]) | |
- axsc2.set_yticklabels([]) | |
- | |
- axsc2.set_title('\\textbf{2. Fast creep}', fontsize=7) | |
- if upper_limit < 1.0: | |
- cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04) | |
- else: | |
- cbar = plt.colorbar(cs, fraction=0.045, pad=0.04) | |
- cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]') | |
- #cbar.set_label('Contact force [N]') | |
- cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4) | |
- cbar.update_ticks() | |
- | |
- # plot defined max compressive stress from tau/N ratio | |
- axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='+', c='none', edgecolor='red', s=100) | |
- axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='o', c='none', edgecolor='red', s=100) | |
- ''' | |
- ax.sc2scatter(0., # actual stress | |
- numpy.degrees(numpy.arctan( | |
- self.shearStress('effective')/ | |
- self.currentNormalStress('effective'))), | |
- marker='+', color='blue', s=300) | |
- ''' | |
- | |
- axsc2.set_rmax(90) | |
- axsc2.set_rticks([]) | |
- #axsc2.grid(False) | |
- | |
- # force chain plot | |
- | |
- #axfc2 = fig.add_axes([Lx+dx+0.05, Ly+0.03, dx, dy*0.7]) | |
- axfc2 = fig.add_axes([Lx+dx+0.08, Ly+0.035, dx, dy*0.7]) | |
- | |
- data = datalists[sc] | |
- | |
- # find the max. value of the normal force | |
- #f_n_max = numpy.amax(data[:,6]) | |
- | |
- # specify the lower limit of force chains to do statistics on | |
- f_n_lim = lower_limit * f_n_max | |
- | |
- # find the indexes of these contacts | |
- I = numpy.nonzero(data[:,6] >= f_n_lim) | |
- | |
- #color = matplotlib.cm.spectral(data[:,6]/f_n_max) | |
- for i in I[0]: | |
- | |
- x1 = data[i,0] | |
- #y1 = data[i,1] | |
- z1 = data[i,2] | |
- x2 = data[i,3] | |
- #y2 = data[i,4] | |
- z2 = data[i,5] | |
- f_n = data[i,6] | |
- | |
- lw_max = 1.0 | |
- if f_n >= f_n_max: | |
- lw = lw_max | |
else: | |
- lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max | |
- | |
- #print lw | |
- axfc2.plot([x1,x2], [z1,z2], '-k', linewidth=lw) | |
- #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes… | |
- #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color) | |
- | |
- axfc2.spines['right'].set_visible(False) | |
- axfc2.spines['left'].set_visible(False) | |
- # Only show ticks on the left and bottom spines | |
- axfc2.xaxis.set_ticks_position('none') | |
- axfc2.yaxis.set_ticks_position('none') | |
- axfc2.set_xticklabels([]) | |
- axfc2.set_yticklabels([]) | |
- axfc2.set_xlim([numpy.min(data[I[0],0]), numpy.max(data[I[0],0])]) | |
- axfc2.set_ylim([numpy.min(data[I[0],2]), numpy.max(data[I[0],2])]) | |
- axfc2.set_aspect('equal') | |
- | |
- | |
- | |
- | |
- # Scatter plot 3 | |
- sc=2 | |
- #Lx=.50; Ly=.40; | |
- Lx=.65; Ly=.40; | |
- #xytext=(Lx+.5*dx, Ly+.5*dy) | |
- #xytext=(Lx+1.75*dx, Ly+0.01) | |
- xytext=(Lx+1.15*dx, 0.2) | |
- xy=(ts[sc]*scalingfactor, Ns[sc]/1000.) | |
- #print xytext | |
- #print xy | |
- ax1.annotate('', | |
- xytext=xytext, textcoords='axes fraction', | |
- xy=xy, xycoords='data', | |
- arrowprops=dict(arrowstyle='->', connectionstyle='arc3')) | |
- | |
- axsc2 = fig.add_axes([Lx, Ly, dx, dy], polar=True) | |
- | |
- cs = axsc2.scatter(strikelists[sc], 90. - diplists[sc], marker='o', | |
- c=forcemagnitudes[sc], | |
- s=forcemagnitudes[sc]/f_n_max*5., | |
- alpha=alphas[sc], | |
- edgecolors='none', | |
- vmin=f_n_maxs[sc]*lower_limit, | |
- vmax=f_n_maxs[sc]*upper_limit, | |
- cmap=matplotlib.cm.get_cmap('afmhot_r'))#, | |
- #norm=matplotlib.colors.LogNorm()) | |
- # tick locations | |
- #thetaticks = numpy.arange(0,360,90) | |
- # set ticklabels location at 1.3 times the axes' radius | |
- #ax.set_thetagrids(thetaticks, frac=1.3) | |
- axsc2.set_xticklabels([]) | |
- axsc2.set_yticklabels([]) | |
- | |
- axsc2.set_title('\\textbf{3. Slip}', fontsize=7) | |
- if upper_limit < 1.0: | |
- cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04) | |
- else: | |
- cbar = plt.colorbar(cs, fraction=0.045, pad=0.04) | |
- cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]') | |
- #cbar.set_label('Contact force [N]') | |
- cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4) | |
- cbar.update_ticks() | |
- | |
- # plot defined max compressive stress from tau/N ratio | |
- axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='+', c='none', edgecolor='red', s=100) | |
- axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])), | |
- marker='o', c='none', edgecolor='red', s=100) | |
- ''' | |
- ax.sc2scatter(0., # actual stress | |
- numpy.degrees(numpy.arctan( | |
- self.shearStress('effective')/ | |
- self.currentNormalStress('effective'))), | |
- marker='+', color='blue', s=300) | |
- ''' | |
- | |
- axsc2.set_rmax(90) | |
- axsc2.set_rticks([]) | |
- #axsc2.grid(False) | |
- | |
- # force chain plot | |
- | |
- axfc2 = fig.add_axes([Lx-0.007, Ly-0.7*dy, dx, dy*0.7]) | |
- #axfc2 = fig.add_axes([Lx+dx+0.05, Ly+0.03, dx, dy*0.7]) | |
- | |
- data = datalists[sc] | |
- | |
- # find the max. value of the normal force | |
- #f_n_max = numpy.amax(data[:,6]) | |
- | |
- # specify the lower limit of force chains to do statistics on | |
- f_n_lim = lower_limit * f_n_max | |
- | |
- # find the indexes of these contacts | |
- I = numpy.nonzero(data[:,6] >= f_n_lim) | |
- | |
- #color = matplotlib.cm.spectral(data[:,6]/f_n_max) | |
- for i in I[0]: | |
- | |
- x1 = data[i,0] | |
- #y1 = data[i,1] | |
- z1 = data[i,2] | |
- x2 = data[i,3] | |
- #y2 = data[i,4] | |
- z2 = data[i,5] | |
- f_n = data[i,6] | |
- | |
- lw_max = 1.0 | |
- if f_n >= f_n_max: | |
- lw = lw_max | |
- else: | |
- lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max | |
- | |
- #print lw | |
- axfc2.plot([x1,x2], [z1,z2], '-k', linewidth=lw) | |
- #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes… | |
- #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color) | |
- | |
- axfc2.spines['right'].set_visible(False) | |
- axfc2.spines['left'].set_visible(False) | |
- # Only show ticks on the left and bottom spines | |
- axfc2.xaxis.set_ticks_position('none') | |
- axfc2.yaxis.set_ticks_position('none') | |
- axfc2.set_xticklabels([]) | |
- axfc2.set_yticklabels([]) | |
- axfc2.set_xlim([numpy.min(data[:,0]), numpy.max(data[:,0])]) | |
- axfc2.set_ylim([numpy.min(data[:,2]), numpy.max(data[:,2])]) | |
- axfc2.set_aspect('equal') | |
- | |
- | |
- | |
- | |
+ axhistload1 = fig.add_axes([Lx[sc], Ly[sc], dx, dy]) | |
+ axhistload1.hist(datalists[sc][:,6], alpha=0.75, facecolor='gray',… | |
+ #plt.yscale('log', nonposy='clip') | |
+ axhistload1.set_xlim([0,50.]) | |
+ axhistload1.set_xlabel('Contact load [N]') | |
+ axhistload1.set_ylabel('Count') | |
+ | |
+ # force chain plot | |
+ | |
+ axfc1 = fig.add_axes([fc_x[sc], fc_y[sc], fc_dx[sc], fc_dy[sc]]) | |
+ | |
+ data = datalists[sc] | |
+ | |
+ # find the max. value of the normal force | |
+ #f_n_max = numpy.amax(data[:,6]) | |
+ | |
+ # specify the lower limit of force chains to do statistics on | |
+ f_n_lim = lower_limit * f_n_max | |
+ | |
+ # find the indexes of these contacts | |
+ I = numpy.nonzero(data[:,6] >= f_n_lim) | |
+ | |
+ #color = matplotlib.cm.spectral(data[:,6]/f_n_max) | |
+ for i in I[0]: | |
+ | |
+ x1 = data[i,0] | |
+ #y1 = data[i,1] | |
+ z1 = data[i,2] | |
+ x2 = data[i,3] | |
+ #y2 = data[i,4] | |
+ z2 = data[i,5] | |
+ f_n = data[i,6] | |
+ | |
+ lw_max = 1.0 | |
+ if f_n >= f_n_max: | |
+ lw = lw_max | |
+ else: | |
+ lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max | |
+ | |
+ #print lw | |
+ axfc1.plot([x1,x2], [z1,z2], '-k', linewidth=lw) | |
+ #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnit… | |
+ #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color) | |
+ | |
+ axfc1.spines['right'].set_visible(False) | |
+ axfc1.spines['left'].set_visible(False) | |
+ # Only show ticks on the left and bottom spines | |
+ axfc1.xaxis.set_ticks_position('none') | |
+ axfc1.yaxis.set_ticks_position('none') | |
+ axfc1.set_xticklabels([]) | |
+ axfc1.set_yticklabels([]) | |
+ axfc1.set_xlim([numpy.min(data[I[0],0]), numpy.max(data[I[0],0])]) | |
+ axfc1.set_ylim([numpy.min(data[I[0],2]), numpy.max(data[I[0],2])]) | |
+ axfc1.set_aspect('equal') | |
diff --git a/python/sphere.py b/python/sphere.py | |
t@@ -5372,6 +5372,7 @@ class sim: | |
#hist, bins = numpy.histogram(datadata[:,6], bins=10) | |
n, bins, patches = plt.hist(data[:,6], alpha=0.75, facecolor='gray… | |
#plt.xlabel('$\\boldsymbol{f}_\text{n}$ [N]') | |
+ plt.yscale('log', nonposy='clip') | |
plt.xlabel('Contact load [N]') | |
plt.ylabel('Count $N$') | |
plt.grid(True) |