2014-10-01 134 views
0

你好的Python/Matplotlib大師,Matplotlib - 設置軸標籤在沒有蜱

我想在其中特定水平線繪製的隨機點來標記y軸。

我的Y軸不應該有任何值,只顯示主要的刻度。

爲了清楚地說明我的要求,我將使用一些截圖。 我有什麼當前: enter image description here 我想要什麼: enter image description here

正如你所看到的,E1E2不完全在大刻度線。實際上,我知道y軸值(儘管它們應該是隱藏的,因爲它是一個模型圖)。我也知道E1E2的數值。

我將不勝感激。

讓我的代碼片段如下:

ax3.axis([0,800,0,2500) #You can see that the major YTick-marks will be at 500 intervals 
ax3.plot(x,y) #plot my lines 
E1 = 1447 
E2 = 2456 
all_ticks = ax3.yaxis.get_all_ticks() #method that does not exist. If it did, I would be able to bind labels E1 and E2 to the respective values. 

感謝您的幫助!

編輯: 對於另一個圖形,我使用此代碼爲標籤提供各種顏色。這很好地工作。 energy_rangelabels_energycolors_energy是numpy的陣列一樣大,我的y軸,在我的情況下,2500

#Modify the labels and colors of the Power y-axis 
for i, y in enumerate(energy_range): 
    if (i == int(math.floor(E1))): 
     labels_energy[i] = '$E_1$' 
     colors_energy[i] = 'blue' 

    elif (i == int(math.floor(E2))): 
     labels_energy[i] = '$E_2$' 
     colors_energy[i] = 'green' 
    else: 
     labels_energy.append('') 

#Modify the colour of the energy y-axis ticks 
for color,tick in zip(colors_energy,ax3.yaxis.get_major_ticks()): 
    print color, tick 
    if color: 
     print color 
     tick.label1.set_color(color) #set the color property 
ax3.get_yaxis().set_ticklabels(labels_energy) 

EDIT2: 虛擬值全部樣本:

#!/bin/python 
import matplotlib 
# matplotlib.use('Agg') #Remote, block show() 

import numpy as np 
import pylab as pylab 
from pylab import * 
import math 

import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator 
import matplotlib.font_manager as fm 
from matplotlib.font_manager import FontProperties 
import matplotlib.dates as mdates 
from datetime import datetime 
import matplotlib.cm as cm 
from matplotlib.ticker import MultipleLocator, FormatStrFormatter 

from scipy import interpolate 

def plot_sketch(): 
    x = np.arange(0,800,1) 
    energy_range = range (0,2500,1) #Power graph y-axis range 
    labels_energy = [''] * len(energy_range) 
    colors_energy = [''] * len(energy_range) 
    f1=4 
    P1=3 
    P2=2 
    P3=4 
    f2=2 
    f3=6 

    #Set Axes ranges  
    ax3.axis([0,800,0,energy_range[-1]]) 

    #Add Energy lines; E=integral(P) dt 
    y=[i * P1 for i in x] 
    ax3.plot(x,y, color='b') 
    y = [i * P2 for i in x[:0.3*800]] 
    ax3.plot(x[:0.3*800],y, color='g') 
    last_val = y[-1] 
    y = [(i * P3 -last_val) for i in x[(0.3*800):(0.6*800)]] 
    ax3.plot(x[(0.3*800):(0.6*800)],y, color='g') 

    E1 = x[-1] * P1 
    E2 = (0.3 * x[-1]) * P2 + x[-1] * (0.6-0.3) * P3 

    #Modify the labels and colors of the Power y-axis 
    for i, y in enumerate(energy_range): 
     if (i == int(math.floor(E1))): 
      labels_energy[i] = '$E_1$' 
      colors_energy[i] = 'blue' 

     elif (i == int(math.floor(E2))): 
      labels_energy[i] = '$E_2$' 
      colors_energy[i] = 'green' 
     else: 
      labels_energy.append('') 

    #Modify the colour of the power y-axis ticks 
    for color,tick in zip(colors_energy,ax3.yaxis.get_major_ticks()): 
     if color: 
      tick.label1.set_color(color) #set the color property 

    ax3.get_yaxis().set_ticklabels(labels_energy) 

    ax3.axhline(energy_range[int(math.floor(E1))], xmin=0, xmax=1, linewidth=0.25, color='b', linestyle='--') 
    ax3.axhline(energy_range[int(math.floor(E2))], xmin=0, xmax=0.6, linewidth=0.25, color='g', linestyle='--') 
    #Show grid 
    ax3.xaxis.grid(True) 


#fig = Sketch graph 
fig = plt.figure(num=None, figsize=(14, 7), dpi=80, facecolor='w', edgecolor='k') 
fig.canvas.set_window_title('Sketch graph') 

ax3 = fig.add_subplot(111) #Energy plot 
ax3.set_xlabel('Time (ms)', fontsize=12) 
ax3.set_ylabel('Energy (J)', fontsize=12) 

pylab.xlim(xmin=0) # start at 0 
plot_sketch() 
plt.subplots_adjust(hspace=0) 
plt.show() 
+0

我加入了虛擬值代碼的完整片段。 – shailenTJ 2014-10-01 11:26:50

+0

噢,我設法以一種非常冒險的方式來解決這個問題。我以1的間隔啓用了所有次要的tick。然後,我將tick的可見性設置爲False。然後,我遍歷所有的蜱蟲並在我想要的位置(例如y1 = 1447,y2 = 2456)選擇蜱蟲,並修改它們的值。正如你所看到的,y1和y2不能是主要的蜱蟲。我會盡快發佈我的哈克解決方案。我認爲做我想做的事的能力應該更簡單。該功能可能不適用於matplotlib 1.4.0(目前是最新版本) – shailenTJ 2014-10-01 14:01:55

回答

0

我想你正在尋找正確的轉換(請檢查this)。在你的情況下,我認爲你想要的只是使用text方法和正確的transform kwarg。您的axhline後嘗試添加這對你的plot_sketch函數調用:

ax3.text(0, energy_range[int(math.floor(E1))], 
     'E1', color='g', 
     ha='right', 
     va='center', 
     transform=ax3.get_yaxis_transform(), 
     ) 
ax3.text(0, energy_range[int(math.floor(E2))], 
     'E2', color='b', 
     ha='right', 
     va='center', 
     transform=ax3.get_yaxis_transform(), 
     ) 

get_yaxis_transform方法返回一個「混合」變換這使得x值輸入到text呼叫在軸單元被繪製,並且在y的數據'數據'單位。你可以調整x數據的值(0)爲-0.003或者如果你需要一點填充(或者你可以使用ScaledTranslation轉換,但是如果這是一次性修正,通常是不必要的)。

你可能也想使用set_ylabel的「labelpad」選項,例如:

ax3.set_ylabel('Energy (J)', fontsize=12, labelpad=20)