2016-04-02 4 views
1

У меня есть многоуровневый индексный фрейм, который я пытаюсь отобразить в Seaborn. Сюжет показывает тонкий, но значения оси x обрабатываются как текстовые метки вместо фактических значений x. Фрагмент кода ниже показывает, как выборка данных производится и наносили на график:X-Axis неправильно расположен в Seaborn

>>> import numpy, pandas, seaborn 
>>> from matplotlib import pyplot 
>>> index = pandas.MultiIndex.from_product((list('abc'), [10**x for x in range(4)]), names=['letters', 'powers']) 
>>> index 
MultiIndex(levels=[['a', 'b', 'c'], [1, 10, 100, 1000]], 
      labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]], 
      names=['letters', 'powers']) 

>>> df = pandas.DataFrame(numpy.random.randn(12, 2), index=index, columns=['x', 't']) 
>>> df 
         x   t 
letters powers      
a  1  1.764052 0.400157 
     10  0.978738 2.240893 
     100  1.867558 -0.977278 
     1000 0.950088 -0.151357 
b  1  -0.103219 0.410599 
     10  0.144044 1.454274 
     100  0.761038 0.121675 
     1000 0.443863 0.333674 
c  1  1.494079 -0.205158 
     10  0.313068 -0.854096 
     100 -2.552990 0.653619 
     1000 0.864436 -0.742165 

>>> seaborn.factorplot(x='powers', y='t', hue='letters', data=df.reset_index()) 
>>> pyplot.show() 

график показывает вверх:

plot of sample data

Тем не менее, ось х с использованием численных значений в виде текстовых меток. Я хотел бы, чтобы ось х отображала экспоненциальную прогрессию, как ожидалось, из значений (то есть 1000 должно быть в 10 раз дальше от 100, чем 100 - от 10). Как я могу это исправить?

Я подозреваю, что мультииндекс не имеет отношения к проблеме, но, возможно, тип данных, которые он интерпретирует, является значительным. Аналогичная проблема, похоже, происходит здесь: seaborn boxplots at desired distances along the x axis. Я не думаю, что это дубликат, но если сообщество не соглашается, я буду признателен за краткое объяснение того, как применить его к моему делу.

ответ

4

factorplot рассматривает ваши [1, 10, 100, 1000] как категории (или факторы). Это не цифры для морского дна - просто метки. Вот почему они распределены равномерно (и внутренне они помещают эти метки в линейную разнесенную шкалу от 0 до 3). Побочным эффектом этого является то, что он имитирует представление с масштабированием в виде журнала, которое вы, возможно, захотите сохранить.

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

fig, ax = plt.subplots(figsize=(5,3)) 

for l in df.index.get_level_values(0).unique(): 
    ax.plot(df.loc[l, 'x'], 'o-', label=l) 
ax.legend(loc=0) 
ax.set_xlim([-10, 1001]) 
ax.set_xticks(df.index.get_level_values(1).unique()) 

Что будет производить диаграмму, как это:

enter image description here

И я не уверен, что это действительно то, что вам нужно, так как представляющие линейную шкалу на оси х делает левая сторона нечитаемым. В текущем графике есть вид масштабируемой оси «log», которая представляется более читаемым.

+0

Спасибо. Это именно то, что я искал. Таким образом, «ax.set_ * scale» может применяться по желанию. В случае, если вам интересно, у меня есть некоторые данные, которые были получены в квазилогарифмических интервалах, но должны показывать линейную зависимость на регулярном графике. Как только я проведу линейную зависимость, я, вероятно, возьму ваш совет и сделаю полулогарифмический или логарифмический график, если линейный неадекватен. –

+0

Кстати, я читаю вашу часть об импорте правильно? Изменяет ли импорт морского судна значения по умолчанию для последующих регулярных графиков matplotlib? –

+1

Правильно - при импорте seaborn он перезапишет значения matplotlib по умолчанию для этого сеанса или пока вы не измените эти настройки вручную. – Primer

Смежные вопросы