Подтвердить что ты не робот

Matplotlib, так что ось журнала имеет только незначительные метки меток в указанных точках. Также измените размер ярлыков меток в colorbar

Я пытаюсь создать сюжет, но я просто хочу, чтобы метки метки показывались, как показано, где шкала журнала показана выше. Мне нужна только небольшая метка для 50, 500 и 2000, чтобы показать. Есть ли способ указать ярлыки для ярлыков? Я пытался понять это немного, но не нашел хорошего решения. Все, что я могу представить, это получить minorticklabels() и установить значение fontsize равным 0. Это показано ниже первого фрагмента кода. Я надеялся, что было более чистое решение.

Другое дело - изменение размера метки метки в цветовой панели, которую я не понял. Если кто-нибудь знает способ сделать это, пожалуйста, дайте мне знать, потому что я не вижу метод в colorbar, который легко это делает.

Первый код:

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

enter image description here

Второй код:

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

enter image description here

Для цветной панели: Еще один быстрый вопрос, если вы не возражаете, потому что пытаетесь понять это, но не совсем уверены. Я хочу использовать научную нотацию, которую я могу получить с помощью ScalarFormatter. Как установить количество десятичных знаков и множитель? Я бы хотел, чтобы это было как 8x10 ^ 8 или .8x10 ^ 9, чтобы сэкономить место вместо того, чтобы поместить все эти нули. Я считаю, что есть много способов сделать это внутри объекта axes, но то, что вы считаете лучшим способом. Я не могу понять, как изменить обозначение при изменении ScalarFormatter.

Для диаграммы: Кроме того, мои данные имеют точки, начинающиеся с 46, а затем при последовательных умножениях, умноженных на 2 ^ (1/12), так что 46,49,50,55,58,61... 3132. Все они округлены, но лежат близко к 2 ^ (1/12). Я решил лучше разместить крупные тикеры рядом с этими цифрами. Это лучший способ использовать фиксированный форматтер и использовать тикер каждые 15 или около того в freqArray. Затем используйте небольшой тикер на каждой другой частоте. Могу ли я сделать это и все еще поддерживать ось журнала?

4b9b3361

Ответ 1

1) Используйте FixedLocator для статического определения явных мест тика.

2) Colorbar cbar будет иметь атрибут ax, который предоставит доступ к обычным методам осей, включая форматирование тика.

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()

enter image description here

Edit

Если вы хотите отмечать маркеры, но вы хотите выборочно отображать метки, я не вижу ничего плохого в вашей итерации, кроме как использовать set_visible вместо того, чтобы сделать нулевой размер шрифта.

Вам может понравиться более тонкое управление с помощью FuncFormatter, где вы можете использовать значение или положение галочки, чтобы решить, будет ли показано:

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))

Ответ 2

На основе ответа от @Paul я создал следующую функцию:

def get_formatter_function(allowed_values, datatype='float'):
    """returns a function, which only allows allowed_values as axis tick labels"""
    def hide_others(value, pos):
        if value in allowed_values:
            if datatype == 'float':
                return value
            elif datatype == 'int':
                return int(value)
        return ''
    return hide_others

Это немного более гибко.