Matplotlib - 无法在图表中看到特定的图表

时间:2016-01-27 16:36:02

标签: python matplotlib plot graph

在下面的脚本中,我不知道为什么在.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')

数据类似于下图中的数据,可以在以下链接中找到:

https://www.dropbox.com/s/theu3ol95moirjo/data.xlsx?dl=0

enter image description here

2 个答案:

答案 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