0

我无法弄清楚如何使图例与子图中的数字(见下图)不重叠。问题是我的斧头很复杂,因为它们来自风玫瑰。获取坐标轴:

1)我已经从https://github.com/akrherz/windrose/tree/darylchanges下载了 windrose.py

2)我将windrose.py复制到与我的python脚本example.py相同的路径中

3) 根据matplotlib 中 Windrose 的子图的步骤,我更改了 windrose.py 以便它能够绘制子图 。这些步骤是将 WindroseAxes 作为投影到 matplotlib 中。我编辑了文件 windrose.py:

3a) 包括一个

import from matplotlib.projections import register_projection 

在文件的开头。

3b)然后添加一个名称变量:

class WindroseAxes(PolarAxes):
    name = 'windrose'
    ...

3c) 最后,在 windrose.py 的末尾,添加:

register_projection(WindroseAxes)

完成后,您可以使用 matplotlib 轴的投影参数轻松创建 windrose 轴。

4)现在我在下面运行我的脚本(我的真实脚本示例)

from windrose import WindroseAxes
import numpy as np
import matplotlib.pyplot as plt
from windrose_subplot import WindroseAxes

wind_speeds1 = np.array([12,10,13,15])
wind_dirs1 = np.array([60,76,32,80]) # in degrees

wind_speeds2 = np.array([23,12,10,8])
wind_dirs2 = np.array([23,45,29,13])

fig = plt.figure()
ax1 = fig.add_subplot(231,projection='windrose')
ax1.bar(wind_dirs1,wind_speeds1,normed=True,opening=0.8,edgecolor='white')
ax2 = fig.add_subplot(232,projection='windrose')
ax2.bar(wind_dirs2,wind_speeds2,normed=True,opening=0.8,edgecolor='white')

ax1.legend()
ax2.legend()
plt.tight_layout()
plt.show()

理想情况下,我想用所有子图的最大/最小创建一个图例,因为它们都是相同的单位。对于跨子图的相同值,该图例必须是每个子图的相应颜色(例如,与所有子图相关的单个正常图例)。真实脚本中将有 6 个子图,但现在这里有 2 个子图显示了这一点。

图例重叠

4

2 回答 2

0

这很容易解决。为了只绘制一个图例,请注释掉或删除绘制第一个图例的位置。为了将图例移出绘图,请使用 bbox_to_anchor=() 和一些逻辑位置。有关适用于此示例的示例,请参见下文。

import numpy as np
import matplotlib.pyplot as plt
from windrose_subplot import WindroseAxes

wind_speeds1 = np.array([12,10,13,15])
wind_dirs1 = np.array([60,76,32,80]) # in degrees

wind_speeds2 = np.array([23,12,10,8])
wind_dirs2 = np.array([23,45,29,13])

fig = plt.figure()
ax1 = fig.add_subplot(231,projection='windrose')
ax1.bar(wind_dirs1,wind_speeds1,normed=True,opening=0.8,edgecolor='white')
ax2 = fig.add_subplot(232,projection='windrose')
ax2.bar(wind_dirs2,wind_speeds2,normed=True,opening=0.8,edgecolor='white')

# ax1.legend()
ax2.legend(bbox_to_anchor=(1.2 , -0.1))
plt.tight_layout()
plt.show()

在此处输入图像描述

但是,请注意 bbox_to_anchor 依赖于图例来自的轴,所以

ax1.legend(bbox_to_anchor=1.2, -0.1))
#ax2.legend()

将在第二个轴下方显示图例:

在此处输入图像描述

于 2018-03-23T19:44:11.657 回答
0

谢谢Hazard11,我发现您的回答非常有用:) 答案有一个问题,尽管图例不代表第一个子图,因为在创建第二个子图时会生成垃圾箱。

我刚刚解决了这个问题,首先使用 numpy.histogram 计算 bin,然后windrose.WindroseAxes.bar()在创建每个风玫瑰时将其传递给。这样做意味着您需要选择要使用哪个来生成垃圾箱。另一种方法是手动定义 bin 或创建一个函数,为两者生成一些有效的 bin,然后可以使用它们。

wind_speeds1 = np.array([12,10,13,15])
wind_dirs1 = np.array([60,76,32,80]) # in degrees

wind_speeds2 = np.array([23,12,10,8])
wind_dirs2 = np.array([23,45,29,13])

wind_speeds_bins = np.histogram(wind_speeds2, 5)[1]

fig = plt.figure()
ax1 = fig.add_subplot(231, projection='windrose')
ax1.bar(wind_dirs1 ,wind_speeds1, normed=True, opening=0.8, edgecolor='white', bins=wind_speeds_bins)
ax2 = fig.add_subplot(232, projection='windrose')
ax2.bar(wind_dirs2, wind_speeds2, normed=True, opening=0.8, edgecolor='white', bins=wind_speeds_bins)

# ax1.legend()
ax2.legend(bbox_to_anchor=(1.2 , -0.1))
plt.tight_layout()
plt.show()
于 2022-03-01T13:43:51.773 回答