【问题标题】:Rescale y-axis without altering plot在不改变绘图的情况下重新调整 y 轴
【发布时间】:2019-08-28 11:14:04
【问题描述】:

我有什么

我正在尝试使用 python 3 创建值的“热图”。
我被困在 y 刻度之间的间距上,几个 SO 问题无法帮助我......

我目前的代码如下:

data = np.load('path\to\data\datafile.npy')

# plot using imshow (and use interpolation)
plt.imshow(data,
           cmap          = 'RdBu_r', 
           aspect        = 'auto', 
           vmin          = -.4,
           vmax          =  .4,
           origin        = 'lower',
           extent        = [-1000, 4500, 2, 48], 
           interpolation = 'hanning')

# plt parameters
plt.xlim(-750, 4250)
plt.colorbar()
plt.vlines(0, 
           frequencies[0], 
           frequencies[-1], 
           colors = 'black',
           label = 'Stimulus onset',
           linewidth = 2.5)
plt.legend(loc=(1,1.04))
plt.title('Time-frequency using Morlet wavelets\nSubject: {}'.format(SUB_ID))
plt.ylabel('Frequency (in Hz)')
plt.xlabel('Time (in ms)')
plt.show()

这给了我以下情节:

Plot with wrong y-axis scaling

我想要什么

y 轴 上的标签有误。
具体来说,y 轴应具有以下标签(以对数方式间隔):

In [15]:
# parameters
min_freq = 2;
max_freq = 48;
num_frex = 20;

# define frequencies of interest
frequencies = np.logspace(np.log10(min_freq), 
                          np.log10(max_freq), 
                          num_frex)
frequencies

Out[15]: 
array([ 2.        ,  2.36413729,  2.79457255,  3.30337659,  3.90481788,
        4.61576277,  5.45614844,  6.44954198,  7.62380134,  9.01185651,
       10.652633  , 12.59214343, 14.8847779 , 17.59482922, 20.7982959 ,
       24.58501342, 29.06117345, 34.35230187, 40.60677887, 48.        ])

结果图应如下所示(聚焦 y 轴时):

Plot with correct y-label spacing

所以:

  • 情节不应改变
  • y 轴标签应从线性转换为对数
  • 标签之间的间距应与后面的图中相同

datafile.npy can be found here

【问题讨论】:

    标签: python python-3.x matplotlib


    【解决方案1】:

    您只需为绘图提供自定义 ytick 列表:

    # parameters
    min_freq = 2;
    max_freq = 48;
    num_frex = 20;
    
    # define frequencies of interest
    frequencies = np.logspace(np.log10(min_freq), 
                          np.log10(max_freq), 
                          num_frex)
    
    plt.yticks(frequencies)
    

    更多信息请参见https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.yticks.html#matplotlib.pyplot.yticks

    【讨论】:

    • 谢谢,我以前试过这个。通过这样做,绘图将具有线性分离的 y 刻度和标签。我需要对标签之间的间距进行对数缩放,就像在第二个图中一样。
    • 啊,我明白了,你可能想要stackoverflow.com/questions/14530113/…
    • 嗯,间距现在还可以,但是情节本身已经改变了。看起来数据被拉长了......有没有办法让情节本身不可改变,同时仍然改变轴?感谢您的帮助!
    • 在这种情况下,我不明白我原来的解决方案的问题,因为通过将plt.yticks 设置为np.logspace,它们在线性刻度上以对数间隔。你不能有线性数据的对数刻度,因为这些值不会对齐......
    • 简而言之:这是脑电图数据。数据经过预处理,然后使用 logratio 重新缩放(即,我将数据除以基线值的平均值(每个数据时期的最后一秒),然后记录日志)。之后,我尝试使用imshow 绘制数据。现在,Python 不知道数据已经进行了日志转换,并且使用前面注释中的代码会再次更改数据,尽管这不是必需的。只有轴需要不同
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多