Matplotlib 所以对数轴在指定的点上只有次要的刻度线标签.还可以更改颜色栏中刻度标签的大小 [英] Matplotlib so log axis only has minor tick mark labels at specified points. Also change size of tick labels in colorbar
问题描述
我正在尝试创建一个绘图,但我只希望刻度标签显示为如上所示的对数刻度.我只希望显示 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??
推荐答案
- 使用
FixedLocator
静态定义显式刻度位置. - Colorbar
cbar
将有一个.ax
属性,该属性将提供对常用轴方法的访问,包括刻度格式.这不是对axes
(例如ax1
、ax2
等)的引用.
- Use
FixedLocator
to statically define explicit tick locations. - 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 anaxes
(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屋!