如何将特定轴添加到matplotlib子图? [英] How to add specific axes to matplotlib subplot?

查看:61
本文介绍了如何将特定轴添加到matplotlib子图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 matplotlib 制作矩阵图.

I am trying to make a matrix plot with matplotlib.

各个图由一个特定的模块 windrose 制作,该模块将 PolarAxes 子类化.然而,模块中似乎没有定义任何被称为 subplot kwargs 的投影.标准的 polar 投影不起作用,因为缺少某些子类参数.

The individual plots are made with a specific module windrose which subclasses PolarAxes. However there does not seem to be any projection defined in the module to be called as subplot kwargs. The standard polar projection does not work since some of the subclass arguments are missing.

我已经测试了几种方法,但均未成功(即使考虑到本文,也使用了seaborn map: https://stackoverflow.com/a/25702476/3416205).下面是我尝试过的最接近的.有没有办法正确地创建与特定 WindroseAxes 相关联的新matplotlib投影,而无需做任何事情?

I have tested several approaches without success (even with seaborn map considering this post: https://stackoverflow.com/a/25702476/3416205). Hereunder is the closest I have tried. Is there any way to do what I want without properly creating a new matplotlib projection associated with the specific WindroseAxes?

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from windrose import WindroseAxes

df = pd.read_csv('https://raw.githubusercontent.com/AntoineGautier/Data/master/tmp.csv')
fig = plt.figure()
gs = gridspec.GridSpec(4, 2)

def wind_plot(x, y, title=None, axes=None, fig=None):
    ax = WindroseAxes.from_ax()
    ax.set_position(axes.get_position(fig))
    ax.bar(x, y, normed=True, opening=0.8, edgecolor='white', bins=[0, 2.5, 5, 7.5, 10])
    ax.set_title(title)

for (id_s, s) in enumerate(pd.unique(df.saison)):
    for (id_jn, jn) in enumerate(pd.unique(df.jn)):
        tmp = df.query('saison==@s & jn==@jn')
        _ = plt.subplot(gs[id_s, id_jn], polar=True)
        wind_plot(tmp.wd, tmp.ws, title=s + ' - ' + jn, axes=_, fig=fig)

plt.show()

推荐答案

windrose 模块的 github 页面实际上提供了一个子图示例:https://github.com/scls19fr/windrose/blob/master/samples/example_subplots.py.

The github page from the windrose module actually provides an example of subplots: https://github.com/scls19fr/windrose/blob/master/samples/example_subplots.py.

以下作品.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from windrose import WindroseAxes

df = pd.read_csv('https://raw.githubusercontent.com/AntoineGautier/Data/master/tmp.csv')

fig = plt.figure(figsize=(20, 10))
gs = gridspec.GridSpec(2, 4)
gp = gs.get_grid_positions(fig)  # [bottom, top, left, right]

def wind_plot(x, y, title, fig, rect):
    ax = WindroseAxes(fig, rect)
    fig.add_axes(ax)
    ax.bar(x, y, normed=True, opening=0.8, edgecolor='white', bins=[0, 2.5, 5, 7.5, 10])
    ax.set_title(title, position=(0.5, 1.1))

for (id_s, s) in enumerate(pd.unique(df.saison)):
    for (id_jn, jn) in enumerate(pd.unique(df.jn)):
        tmp = df.query('saison==@s & jn==@jn')
        rect = [gp[2][id_s], gp[0][id_jn],
                gp[3][id_s]-gp[2][id_s],
                gp[1][id_jn]-gp[0][id_jn]]  # [left, bottom, width, height]
        wind_plot(tmp.wd, tmp.ws, s + ' | ' + jn, fig, rect)

plt.show()

这篇关于如何将特定轴添加到matplotlib子图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆