2016-05-10 1 views
1

Я пытаюсь построить два файла данных этого типа:Plot конкретные линии для конкретных значений с Pyplot

name1.fits 0 0 2.40359218172 
name2.fits 0 0 2.15961244263 

Третий столбец имеет значения от 0 до 5. Я хочу, чтобы построить колонку 2 против колонки 4, но для строк со значениями в столбце 3 меньше 2 (0 и 1) я хочу сменить col 2 на -0.1, а для строк со значениями больше 3 (4 и 5) я хочу сменить col 2 на +0,1.

Однако мой код, кажется, меняет все значения на +0.1. Вот то, что я до сих пор:

import matplotlib.pyplot as plt 
import numpy as np 

with open('file1.txt') as data, open('file2.txt') as stds: 

    lines1 = data.readlines() 
    lines2 = stds.readlines() 

    x1a = [] 
    x2a = [] 
    x1b = [] 
    x2b = [] 
    x1c = [] 
    x2c = [] 
    y1a = [] 
    y2a = [] 
    y1b = [] 
    y2b = [] 
    y1c = [] 
    y2c = [] 

    for line1 in lines1: 
     p = line1.split() 
     if p[2] < 2:   
      x1a.append(float(p[1])) 
      y1a.append(float(p[3])) 
     elif 1 < p[2] < 4:   
      x1b.append(float(p[1])) 
      y1b.append(float(p[3])) 
     elif p[2] > 3:   
      x1c.append(float(p[1])) 
      y1c.append(float(p[3])) 

    for line2 in lines2: 
     q = line2.split() 
     if q[2] < 2:   
      x2a.append(float(q[1])) 
      y2a.append(float(q[3])) 
     elif 1 < q[2] < 4:   
      x2b.append(float(q[1])) 
      y2b.append(float(q[3])) 
     elif q[2] > 3:   
      x2c.append(float(q[1])) 
      y2c.append(float(q[3])) 

    x1a = np.array(x1a) 
    x2a = np.array(x2a) 
    x1b = np.array(x1b) 
    x2b = np.array(x2b) 
    x1c = np.array(x1c) 
    x2c = np.array(x2c) 
    y1a = np.array(y1a) 
    y2a = np.array(y2a) 
    y1b = np.array(y1b) 
    y2b = np.array(y2b) 
    y1c = np.array(y1c) 
    y2c = np.array(y2c) 

minorLocator = AutoMinorLocator(5) 

fig, ax = plt.subplots(figsize=(8, 8)) 
fig.subplots_adjust(left=0.11, right=0.95, top=0.94) 

plt.plot(x1a-0.1,y1a,'b^',mec='blue',label=r'B0',ms=8) 
plt.plot(x2a-0.1,y2a,'r^',mec='red',fillstyle='none',mew=0.8,ms=8) 
plt.plot(x1b,y1b,'bo',mec='blue',label=r'B0',ms=8) 
plt.plot(x2b,y2b,'ro',mec='red',fillstyle='none',mew=0.8,ms=8) 
plt.plot(x1c+0.1,y1c,'bx',mec='blue',label=r'B0',ms=8) 
plt.plot(x2c+0.1,y2c,'rx',mec='red',fillstyle='none',mew=0.8,ms=8) 

plt.axis([-1.0, 3.0, 0., 4]) 
ax.xaxis.set_tick_params(labeltop='on') 
ax.yaxis.set_minor_locator(minorLocator) 

plt.show() 

Вот сюжет:

plot

Я уверен, что проблема в моих «если». Надеюсь, вы сможете расчистить путь и/или показать мне лучший вариант для этого.

ответ

0

Когда вы делаете ваши запросы (if) необходимо обеспечить преобразование происходит перед вопросом так:

for line1 in lines1: 
     p = line1.split() 
     if p[2] < 2:   
      x1a.append(float(p[1])) 
      y1a.append(float(p[3])) 
     elif 1 < p[2] < 4:   
      x1b.append(float(p[1])) 
      y1b.append(float(p[3])) 
     elif p[2] > 3:   
      x1c.append(float(p[1])) 
      y1c.append(float(p[3])) 

, на самом деле должно быть:

for line1 in lines1: 
    p = line1.split() 
    if float(p[2]) < 2:  # changed here 
     x1a.append(float(p[1])) 
     y1a.append(float(p[3])) 
    elif 1 < float(p[2]) < 4: # There seems to be a problem with this if  
     x1b.append(float(p[1])) 
     y1b.append(float(p[3])) 
    elif float(p[2]) > 3:  # changed here  
     x1c.append(float(p[1])) 
     y1c.append(float(p[3])) 

То же самое для ваших q переменных. Также обратите внимание, что запрос 1 < x < 4 перехватит x > 3 и x < 2. Вы также должны исправить это.

+0

Да! что сделало трюк. Я использовал 'float (p [2])' и '2 <= float (p [2]) <= 3' во втором' if'. Благодаря! – JVR