Matplotlib, поэтому у оси журнала есть только второстепенные метки в определенных точках Также измените размер меток в цветовой панели - PullRequest
17 голосов
/ 04 июля 2011

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

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

Первый код:

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, чтобы сэкономить место вместо того, чтобы ставить все эти нули.Я полагаю, что есть несколько способов сделать это внутри объекта оси, но что вы считаете лучшим способом.Я не могу понять, как изменить нотацию при переходе на ScalarFormatter.

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

Ответы [ 2 ]

109 голосов
/ 04 июля 2011

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

2) Цветная полоса 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

Редактировать

Если вы хотите, чтобы галочка была отмечена, но вы хотите выборочно показывать метки, я не вижу ничего плохогоВаша итерация, за исключением того, что я мог бы использовать 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))
0 голосов
/ 31 августа 2016

Основываясь на ответе @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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...