如何将特定轴添加到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://*.com/a/25702476/3416205).下面是我尝试过的最接近的.有没有办法正确地创建与特定 WindroseAxes
相关联的新matplotlib投影,而无需做任何事情?
I have tested several approaches without success (even with seaborn map considering this post: https://*.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()