Matplotlib,因此对数轴在指定点仅具有较小的刻度标记.同时更改颜色栏中刻度标签的大小 [英] Matplotlib so log axis only has minor tick mark labels at specified points. Also change size of tick labels in colorbar

查看:71
本文介绍了Matplotlib,因此对数轴在指定点仅具有较小的刻度标记.同时更改颜色栏中刻度标签的大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个图,但我只想显示刻度标签,如图所示,其中对数刻度如上所示.我只希望显示50、500和2000的次要ticklabel.无论如何,有没有指定要显示的次要刻度标签?我一直在试图弄清楚这一点,但没有找到一个好的解决方案.我所能想到的就是获取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一样,以节省空间而不是将所有这些零都放入.我认为有多种方法可以在axes对象中执行此操作,但是您认为这是最好的方法.在更改为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静态定义显式刻度位置.

1) Use FixedLocator to statically define explicit tick locations.

2)彩条cbar将具有ax属性,该属性将提供对常用轴方法(包括刻度格式)的访问.

2) Colorbar cbar will have an ax attribute that will provide access to the usual axis methods including tick formatting.

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而不是将fontsize设置为零.

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天全站免登陆