在下面的脚本中,我不知道为什么在.png文件中没有生成对应于line1和line2(当n <= 12时)的图。我只看到生成了line3。我使用了非常相似的代码,这些代码早先工作但现在它没有显示图中的line1和line2。有什么想法吗?
很抱歉发布这么长的脚本。只是想确保我不会错过任何东西。
import matplotlib.pyplot as plt
import matplotlib; import matplotlib.gridspec as gridspec
from matplotlib.ticker import AutoMinorLocator
import pylab as pl
import numpy as np
#changing default fonts throughout
matplotlib.rc('font',**{'family':'sans-serif','sans-serif':['Helvetica'], 'weight':'bold'})
from matplotlib.font_manager import fontManager, FontProperties
matplotlib.rcParams['mathtext.fontset'] = 'custom'
matplotlib.rcParams['mathtext.rm'] = 'Helvetica'
matplotlib.rcParams['mathtext.it'] = 'Helvetica:italic'
matplotlib.rcParams['mathtext.bf'] = 'Helvetica:bold'
font= FontProperties(weight='bold',size=20)
#load text and columns into different variables
#-----------functions-----------
def ax_lw():
for axis in ['top','bottom','left','right']:
ax.spines[axis].set_linewidth(3)
def tlabels():
for tick in ax.xaxis.get_ticklabels():
tick.set_fontsize(28)
tick.set_weight('bold')
for tick in ax.yaxis.get_ticklabels():
tick.set_fontsize(28)
tick.set_weight('bold')
def format():
ax.set_ylabel(r'$\mathrm{ \bf{\Delta{}E}}$',fontsize=30,fontweight='bold')
ax.tick_params(axis='x', which='both', direction='in', length=10, width=3, pad=8, labelbottom='on', bottom='on', top='off') # labelsize='small'
ax.tick_params(axis='y', which='major', direction='in', length=10, width=3, pad=8, right='off') # labelsize='small'
ax.tick_params(axis='y', which='minor', direction='in', length=6, width=2, right='off') # labelsize='small'
ax.set_xticks(r); ax.set_xticklabels(data[list[3]],rotation=0)
minorLocator = AutoMinorLocator(2); ax.yaxis.set_minor_locator(minorLocator)
#ax.text(5.0,-0.25, r'$\mathrm{ \bf{\Delta{}E_{ads}^{vac}}=-0.39{ }eV}$', fontsize=20)
#-------------------------------PBE----------------
list=[]; count = 0
for num,i in enumerate(open("pbe")):
if i.strip():
count += 1
if num == 0:
cols = i.strip().split()
for num,i in enumerate(cols):
list.append(cols[num])
data = np.genfromtxt('pbe', names=True, dtype=None, usecols=list)
r = np.arange(0,(count-1)*1.5,1.5) #-1 for excluding the first line
#plot
fig = plt.figure(figsize=(28.8,12), dpi=300)
n=4; m=count=0
axis = [(-0.5,8, -1.0,0.2)] * 5
abcde = ['a)', 'b)', 'c)', 'd)', 'e)']
#gs = gridspec.GridSpec(4, 6)
for j in range(2):
for k in range(3):
#for j in range(0,4,2):
# for k in range(0,6,2):
if (n <=12 and count <=4):
# ax = plt.subplot(gs[j:j+2,k:k+2])
ax = plt.subplot2grid((2,3), (j,k))
line1, = ax.plot(r,data[list[n]], marker='v', markeredgecolor='black', color='black', linestyle='-', markersize=18, linewidth=3)
line2, = ax.plot(r,data[list[n+1]], marker='^', markeredgecolor='black', color='red', linestyle='-', markersize=18, linewidth=3)
ax_lw(); tlabels(); format(); plt.axis(axis[m])
plt.axhline(data[list[2]][m],linestyle='--', linewidth=2,color='black')
ax.text(-0.16, 0.95, abcde[count], transform=ax.transAxes, fontsize=28, fontweight='bold')
n += 2; m+=1; count+=1
n=14; m = 0
for i in range(2):
for j in range(3):
if m < 5:
ax = plt.subplot2grid((2,3), (i,j))
line3, = ax.plot(r,data[list[n]], marker='v', markeredgecolor='black', color='red', linestyle='-', markersize=18, linewidth=3)
ax_lw(); tlabels(); format(); plt.axis(axis[m])
n +=1; m+= 1
fig.set_tight_layout(True)
plt.savefig('a.png',dpi=300,format='png',orientation='landscape')
数据类似于下图中的数据,可以在以下链接中找到:
答案 0 :(得分:1)
我没有数据,所以我无法运行它。但是,我强烈怀疑你通过在第3行之前第二次重新定义来覆盖ax
。例如:
for j in range(2):
for k in range(3):
if (n <=12 and count <=4):
# ax = plt.subplot(gs[j:j+2,k:k+2])
ax = plt.subplot2grid((2,3), (j,k))
line1, = ax.plot(r,data[list[n]], marker='v', markeredgecolor='black', color='black', linestyle='-', markersize=18, linewidth=3)
line2, = ax.plot(r,data[list[n+1]], marker='^', markeredgecolor='black', color='red', linestyle='-', markersize=18, linewidth=3)
然后你跟着:
n=14; m = 0
for i in range(2):
for j in range(3):
if m < 5:
ax = plt.subplot2grid((2,3), (i,j))
line3, = ax.plot(r,data[list[n]], marker='v', markeredgecolor='black', color='red', linestyle='-', markersize=18, linewidth=3)
最后:
plt.savefig('a.png',dpi=300,format='png',orientation='landscape')
答案 1 :(得分:0)
谢谢@roganjosh。你的意见有帮助。以下解决了我的问题。我必须在同一个块中使用line3才能不覆盖line1和line2。
for j in range(2):
for k in range(3):
if (n <=12 and count <=4):
ax = plt.subplot2grid((2,3), (j,k))
line1, = ax.plot(r,data[list[n]], marker='v', markeredgecolor='black', color='black', linestyle='-', markersize=18, linewidth=3)
line2, = ax.plot(r,data[list[n+1]], marker='^', markeredgecolor='black', color='red', linestyle='-', markersize=18, linewidth=3)
if 13 < n+p < 19:
line3, = ax.plot(r,data[list[n+p]], color='red', linestyle='--',linewidth=2)
p -= 1
ax_lw(); tlabels(); format(); plt.axis(axis[m])
plt.axhline(data[list[2]][m],linestyle='--', linewidth=2,color='black')
n += 2; m+=1; count+=1