Создание участков с одинаковым масштабом оси, Python, matplotlib - PullRequest
2 голосов
/ 22 января 2020

Я строю сейсмологические данные и создаю фигуру с 16 участками срезов различной глубины. Каждый подзаговор отображает широту / долготу эпицентра, а цвет масштабируется до его величины. Я пытаюсь сделать две вещи:

  1. Настройте масштаб всех графиков так, чтобы они равнялись x и y min и max для выбранной области. Это позволит легко сравнивать графики. (таким образом, все графики будут варьироваться от xmin до xmax и т. д. c)

  2. настроить цвета амплитуды, чтобы они также представляли масштаб (ie цвета представляют все доступные точки, а не только точки на этом конкретном c подговоре)

Я видел, как это было выполнено несколькими способами, но я пытаюсь применить их к l oop в моем коде. Данные, которые я использую, находятся здесь: Данные .

Я разместил свой код и как выглядит текущий вывод ниже.

import matplotlib.pyplot as plt
import pandas as pd

eq_df = pd.read_csv(eq_csv)
eq_data = eq_df[['LON', 'LAT', 'DEPTH', 'MAG']]
nbound = max(eq_data.LAT)
sbound = min(eq_data.LAT)
ebound = max(eq_data.LON)
wbound = min(eq_data.LON)

xlimit = (wbound, ebound)
ylimit = (sbound, nbound)

magmin = min(eq_data.MAG)
magmax = max(eq_data.MAG)

for n in list(range(1,17)):
    km = eq_data[(eq_data.DEPTH > n - 1) & (eq_data.DEPTH <= n)]
    plt.subplot(4, 4, n)
    plt.scatter(km["LON"], km['LAT'], s = 10, c = km['MAG'], vmin = magmin, vmax = magmax) #added vmin/vmax to scale my magnitude data
    plt.ylim(sbound, nbound) # set y limits of plot
    plt.xlim(wbound, ebound) # set x limits of plot
    plt.tick_params(axis='both', which='major', labelsize= 6)
    plt.subplots_adjust(hspace = 1)
    plt.gca().set_title('Depth = ' + str(n - 1) +'km to ' + str(n) + 'km', size = 8) #set title of subplots
    plt.suptitle('Magnitude of Events at Different Depth Slices, 1950 to Today')
plt.show()

Current Figure

ETA: новый код для решения моей проблемы

Ответы [ 2 ]

1 голос
/ 23 января 2020

Наконец-то получил его благодаря некоторой справке выше и некоторому расширенному поиску в Google.

Я обновил свой код выше с примечаниями, указывающими, куда был добавлен код.

Чтобы отрегулировать границы осей моего графика, я использовал:

plt.ylim(sbound, nbound)
plt.xlim(wbound, ebound)

Чтобы масштабировать данные величины по всем графикам, я добавил vmin, vmax к следующей строке:

plt.scatter(km["LON"], km['LAT'], s = 10, c = km['MAG'], vmin = magmin, vmax = magmax)

И вот результирующая цифра: New Figure

0 голосов
/ 24 января 2020

В ответ на этот комментарий на другой ответ, здесь демонстрируется использование sharex=True и sharey=True для этого варианта использования:

import matplotlib.pyplot as plt
import numpy as np

# Supply the limits since random data will be plotted
wbound = -0.1
ebound = 1.1
sbound = -0.1
nbound = 1.1

fig, axs = plt.subplots(nrows=4, ncols=4, figsize=(16,12), sharex=True, sharey=True)
plt.xlim(wbound, ebound)
plt.ylim(sbound, nbound)
for n, ax in enumerate(axs.flatten()):
    ax.scatter(np.random.random(20), np.random.random(20), 
               c = np.random.random(20), marker = '.')
    ticks = [n % 4 == 0, n > 12]
    ax.tick_params(left=ticks[0], bottom=ticks[1])
    ax.set_title('Depth = ' + str(n - 1) +'km to ' + str(n) + 'km', size = 12)

plt.suptitle('Magnitude of Events at Different Depth Slices, 1950 to Today', y = 0.95)
plt.subplots_adjust(wspace=0.05)
plt.show()

enter image description here

Объяснение пары вещей:

  1. Я сократил горизонтальный интервал между участками с помощью subplots_adjust(wspace=0.05)
  2. plt.suptitle не должно быть (и не должно быть) в l oop.
  3. ticks = [n % 4 == 0, n > 12] создает пару bool s для каждой оси, которая затем используется для управления тем, какие отметки отмечены.
  4. Левая и нижняя отметки контролируются для каждой оси с помощью ax.tick_params(left=ticks[0], bottom=ticks[1])
  5. plt.xlim() и plt.ylim() нужно вызывать только один раз , до l oop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...