创建具有等轴比例的子图,Python,matplotlib

Creating subplots with equal axis scale, Python, matplotlib

我正在绘制地震数据并正在创建一个包含 16 个不同深度切片的子图的图形。每个子图显示震中的 lat/lon,颜色按震级缩放。我正在尝试做两件事:

  1. 调整所有绘图的比例,使其等于所选区域的 x 和 y 最小值和最大值。这将允许跨地块轻松比较。 (因此所有图的范围从 xmin 到 xmax 等)

  2. 调整幅度颜色,使它们也代表比例(即颜色代表所有可用点,而不仅仅是特定子图上的点)

我已经看到它以多种方式实现,但我正在努力将它们应用到我的代码中的循环中。我使用的数据在这里:Data.

我在下面发布了我的代码和当前输出的样子。

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

预计到达时间:解决我的问题的新代码

感谢上面的一些帮助和一些扩展的谷歌搜索,终于明白了。

我已经更新了上面的代码,并在注释中指出了代码的添加位置。

为了调整我使用的绘图轴的限制:

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)

结果图如下:

响应另一个答案中的 ,这里演示了 sharex=Truesharey=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()

一些事情的解释:

  1. 我减少了子图之间的水平间距 subplots_adjust(wspace=0.05)
  2. plt.suptitle 不需要(也不应该)在循环中。
  3. ticks = [n % 4 == 0, n > 12] 为每个轴创建一对 bools,然后用于控制绘制哪些刻度线。
  4. ax.tick_params(left=ticks[0], bottom=ticks[1])
  5. 控制每个轴的左侧和底部刻度线
  6. plt.xlim()plt.ylim()只需要在循环
  7. 之前调用一次