【问题标题】:Matplotlib - set an axis label where there are no ticksMatplotlib - 设置一个没有刻度的轴标签
【发布时间】:2014-11-26 05:10:42
【问题描述】:

您好 Python/Matplotlib 大师,

我想在绘制特定水平线的随机点标记 y 轴。

我的 Y 轴不应该有任何值,并且只显示主要刻度。

为了清楚地说明我的要求,我将使用一些屏幕截图。 我目前拥有的: 我想要的是:

如您所见,E1 和 E2 并不完全位于主要刻度线处。实际上,我知道 y 轴值(尽管它们应该被隐藏,因为它是一个模型图)。我也知道 E1 和 E2 的值。

我将不胜感激。

让我的代码sn-p如下:

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_range、labels_energy、colors_energy 是与我的 y 轴一样大的 numpy 数组,在我的例子中是 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)

编辑2: 具有虚拟值的完整样本:

#!/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()

【问题讨论】:

  • 我添加了一个完整的带有虚拟值的代码的 sn-p。
  • 哦,好吧,我设法以一种 非常 hacky 的方式解决了这个问题。我以 1 的间隔启用了所有次要刻度。然后,我将刻度的可见性设置为 False。然后我遍历所有刻度并在我想要的位置选择刻度(例如 y1 = 1447, y2= 2456),并修改它们的值。如您所见,y1 和 y2 不能是主要刻度。我将很快发布我的 hacky 解决方案。我认为做我想做的事情的能力应该更简单。该功能可能在 matplotlib 1.4.0(当前最新版本)中不可用

标签: python matplotlib axis-labels


【解决方案1】:

我认为您正在寻找正确的转换(检查 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 方法返回一个“混合”变换,它使输入到 text 调用的 x 值以轴为单位绘制,y 数据以“数据”为单位绘制。如果您想要一点填充,您可以将 x 数据 (0) 的值调整为 -0.003 或其他值(或者您可以使用 ScaledTranslation 转换,但如果这是一次性修复,则通常没有必要) .

您可能还想为 set_ylabel 使用 'labelpad' 选项,例如:

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

【讨论】:

    【解决方案2】:

    我认为我对其他帖子的回答可能对您有所帮助: Matplotlib: Add strings as custom x-ticks but also keep existing (numeric) tick labels? Alternatives to matplotlib.pyplot.annotate?

    它也适用于 y 轴。结果如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 2012-12-19
      • 2019-08-25
      • 2012-03-14
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多