2016-06-01 2 views
3

У меня возникли проблемы с визуализацией определенного набора данных, который у меня есть на контурном графике. Проблема в том, что у меня есть куча datapoints (X, Y, Z), для которых значения Z варьируются от примерно 2 до 0, где множество интересных функций находится в диапазоне от 0 до 0,3. Используя нормальное масштабирование, они очень трудно увидеть, как показано на этом изображении:Python Matplotlib нелинейное масштабирование в контурном графике

http://i.stack.imgur.com/7O8hH.png

Теперь, я подумал о том, что еще предстоит сделать. Конечно, есть логарифмическое масштабирование, но тогда мне сначала нужно подумать о каком-то сопоставлении, и я не уверен на 100%, как это можно сделать. Вдохновленный this question, можно было подумать о картировании типа scaling(x) = Log(x/min)/Log(max/min), который хорошо работал в этом вопросе.

Также интересным было наблюдение discussed here.

где они использовали какую-то функцию масштабирования ArcSinh. Казалось, что они достаточно хорошо дополняют мелкие черты, пропорционально целому.

Так что мой вопрос в два раза в том, как я полагаю.

  1. Как бы один масштабировать данные в моем контурный график таким образом, чтобы небольшие особенности амплитуды не получают сдувается выбросов?

  2. Вы бы сделали это, используя любой из перечисленных выше способов или используя что-то совершенно другое?

Я довольно новыми для Python, и я постоянно поражаюсь всеми вещами, которые уже там, так что я уверен, что там может быть построен в пути, который лучше, чем что-либо я говорил выше.

Для полноты я загрузил datafile here (сайт загрузки является robustfiles.com, что быстрый поиск Google сказал мне, является надежным веб-сайт, чтобы поделиться такие вещи)

I график выше с

data = np.load("D:\SavedData\ThreeQubitRess44SpecHighResNormalFreqs.npy") 

fig, (ax1) = plt.subplots(1,figsize=(16,16))  
cs = ax1.contourf(X, Y, data, 210, alpha=1,cmap='jet') 
fig.colorbar(cs, ax=ax1, shrink=0.9) 
ax1.set_title("Freq vs B") 
ax1.set_ylabel('Frequency (GHz)'); ax1.set_xlabel('B (arb.)') 
+0

В качестве комментария, вы можете, например, увидеть некоторые особенности около 6,2 ГГц и -0.6 В. Это то, что я хотел бы сделать более явным. – user129412

ответ

2

Отличный вопрос.

Не масштабируйте данные. Вы будете искать компромиссы в диапазонах со многими функциями масштабирования.

Вместо этого используйте custom colormap. Таким образом, вам не придется переназначать ваши фактические данные и легко настраивать визуализацию регионов, которые вы хотели бы выделить. Another example можно найти в скудной поваренной книге, и есть еще немало в Интернете.

+0

Это отличная идея! Я рассмотрю документацию и попытаюсь поиграть с этим. Тем не менее, для меня не совсем очевидно, что это не просто переместит проблему масштабирования в цветовой код. Во-первых, конечно, нужно выбирать хорошо контрастные цвета (и это тоже не тривиально), но тогда мне все же нужно убедиться, что переходы таковы, что детали, которые меня интересуют, становятся видимыми.Скажем, я перехожу от синего до красного в диапазоне от 0 до 1, но большинство моих данных находятся в диапазоне от 0 до 0,2. Тогда мне еще понадобился бы специальный масштаб для цветовой карты, верно? – user129412

+1

@ user129412 Я понимаю вопрос о том, не переместит ли проблема масштабирования в цветовой код. Но цветовая палитра может быть сделана полностью произвольной. Чтобы сделать это с помощью функций масштабирования данных, вы будете искать кусочно-непрерывные функции. Вы будете намного быстрее сделать, изменив цветовой код. Что касается выбора, вы действительно можете сделать его не непрерывным на границе (1: красный, 0,2: синий, затем серого, например) или просто «растянуть» cmap: синий до оранжевого для [0, .2] и оранжевый для красного цвета для (.2, 1]. –

+0

Да, это имеет смысл. На цветовой карте, которую я думаю, более чем достаточно документации, поэтому я должен уметь это понять. Спасибо! – user129412

1

Другой вариант разбить участок в 2 отдельных регионах, разбив ось like so