Matplotlib 所以对数轴在指定的点上只有次要的刻度线标签.还可以更改颜色栏中刻度标签的大小 [英] Matplotlib so log axis only has minor tick mark labels at specified points. Also change size of tick labels in colorbar

查看:29
本文介绍了Matplotlib 所以对数轴在指定的点上只有次要的刻度线标签.还可以更改颜色栏中刻度标签的大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个绘图,但我只希望刻度标签显示为如上所示的对数刻度.我只希望显示 50、500 和 2000 的次要刻度标签.无论如何要指定要显示的次要刻度标签?我一直试图解决这个问题,但还没有找到一个好的解决方案.我能想到的就是获取minorticklabels() 并将fontsize 设置为0.这显示在第一个代码片段下方.我希望有一个更干净的解决方案.

I am trying to create a plot but I just want the ticklabels to show as shown where the log scale is shown as above. I only want the minor ticklabel for 50, 500 and 2000 to show. Is there anyway to specify the minor tick labels to show?? I have been trying to figure this out for a bit but haven't found a good solution. All I can think of is to get the minorticklabels() and set the fontsize to 0. This is shown below the first snippet of code. I was hoping there was a more clean solution.

另一件事是改变颜色栏中刻度标签的大小,我还没有弄清楚.如果有人知道这样做的方法,请告诉我,因为我在颜色栏中没有看到可以轻松执行此操作的方法.

The other thing is changing the size of the ticklabels in the colorbar which I haven't figured out. If anyone knows of a way to do this please let me know because I don't see a method in colorbar that easily does this.

第一个代码:

fig = figure(figto)
ax = fig.add_subplot(111)
actShape = activationTrace.shape
semitones = arange(actShape[1])
freqArray = arange(actShape[0])
X,Y = meshgrid(self.testFreqArray,self.testFreqArray)
Z = sum(activationTrace[:,:,beg:end],axis=2)
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet)
ax.set_position([0.12,0.15,.8,.8])
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
self.plotSetAxisLabels(ax,22)
self.plotSetAxisTickLabels(ax,18)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
return ax, cbar

第二个代码:

fig = figure(figto)
ax = fig.add_subplot(111)
actShape = activationTrace.shape
semitones = arange(actShape[1])
freqArray = arange(actShape[0])
X,Y = meshgrid(self.testFreqArray,self.testFreqArray)
Z = sum(activationTrace[:,:,beg:end],axis=2)
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet)
ax.set_position([0.12,0.15,.8,.8])
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
self.plotSetAxisLabels(ax,22)
self.plotSetAxisTickLabels(ax,18)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
count = 0
for i in ax.xaxis.get_minorticklabels():
    if (count%4 == 0):
        i.set_fontsize(12)
    else:
        i.set_fontsize(0)
    count+=1
for i in ax.yaxis.get_minorticklabels():
    if (count%4 == 0):
        i.set_fontsize(12)
    else:
        i.set_fontsize(0)
    count+=1
return ax, cbar

对于颜色条:如果您不介意,另一个快速问题是因为试图弄清楚但不完全确定.我想使用可以通过 ScalarFormatter 获得的科学记数法.如何设置小数位数和乘数??我希望它像 8x10^8 或 .8x10^9 以节省空间而不是把所有这些零.我认为在轴对象中有多种方法可以做到这一点,但您认为最好的方法是什么.更改为 ScalarFormatter 时,我不知道如何更改符号.

For the colorbar: Another quick question if you don't mind because trying to figure it out but not entirely sure. I want to use scientific notation which I can get with ScalarFormatter. How do I set the number of decimal places and the multiplier?? I'd like it to be like 8x10^8 or .8x10^9 to save space instead of putting all those zeros. I figure there is multiple ways to do this inside the axes object but what do you reckon is the best way. I can't figure out how to change the notation when changing to the ScalarFormatter.

对于图表:另外,我的数据有从 46 开始的点,然后是连续乘以 2^(1/12) 所以 46,49,50,55,58,61...3132.这些都是四舍五入的,但靠近 2^(1/12).我决定最好将主要股票代码放在靠近这些数字的位置.是使用固定格式器并在 freqArray 中每 15 个左右使用一个自动收报机的最佳方法.然后每隔一个频率使用一个小代码.我可以这样做并且仍然保持对数轴吗??

For the chart: Also, my data has points starting at 46 and then at successive multiplies of that multiplied by 2^(1/12) so 46,49,50,55,58,61...3132. These are all rounded but lie close to the 2^(1/12). I decided it better to place major tickers close to these numbers. Is the best way to use the fixed formatter and use a ticker every 15 or so in the freqArray. Then use a minor ticker at every other frequency. Can I do this and still maintain a log axis??

推荐答案

  1. 使用 FixedLocator 静态定义显式刻度位置.
  2. Colorbar cbar 将有一个 .ax 属性,该属性将提供对常用轴方法的访问,包括刻度格式.这不是对 axes(例如 ax1ax2 等)的引用.
  1. Use FixedLocator to statically define explicit tick locations.
  2. Colorbar cbar will have an .ax attribute that will provide access to the usual axis methods including tick formatting. This is not a reference to an axes (e.g. ax1, ax2, etc.).

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(10,3000,100)
y = np.arange(10,3000,100)
X,Y = np.meshgrid(x,y)
Z = np.random.random(X.shape)*8000000
surf = ax.contourf(X,Y,Z, 8, cmap=plt.cm.jet)
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(plt.FormatStrFormatter('%d'))
# defining custom minor tick locations:
ax.xaxis.set_minor_locator(plt.FixedLocator([50,500,2000]))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
# access to cbar tick labels:
cbar.ax.tick_params(labelsize=5) 
plt.show()

编辑

如果你想要刻度线,但你想有选择地显示标签,我认为你的迭代没有任何问题,除了我可能使用 set_visible 而不是使字体大小为零.

If you want the tick marls, but you want to selectively show the labels, I see nothing wrong with your iteration, except I might use set_visible instead of making the fontsize zero.

您可能会喜欢使用 FuncFormatter 进行更好的控制,您可以在其中使用刻度的值或位置来决定是否显示它:

You might enjoy finer control using a FuncFormatter where you can use the value or position of the tick to decide whether it gets shown:

def show_only_some(x, pos):
    s = str(int(x))
    if s[0] in ('2','5'):
        return s
    return ''

ax.xaxis.set_minor_formatter(plt.FuncFormatter(show_only_some))

这篇关于Matplotlib 所以对数轴在指定的点上只有次要的刻度线标签.还可以更改颜色栏中刻度标签的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆