绘制几个极坐标图的散射图

时间:2017-09-17 09:54:40

标签: python matplotlib

我有一个包含五个变量和一个因变量的数据集。一个样本是:

v1  v2  v3  v4  s     a
1.0 0.6 0.8 0.2 56890 98.67
0.8 0.3 1.0 0.5 94948 98.00
1.0 0.8 0.1 0.3 78483 97.13

我想直观地表示所有五个变量和因变量之间的关系。为此,我考虑将两种类型的图组合在一起:

  • sa
  • 之间的散点图
  • v1v2v3v4
  • 的极坐标图

所以基本上我想为我的数据集中的每个数据点显示一个小的极坐标图。像这样:

enter image description here

示例极坐标图是:

import numpy as np
import matplotlib.pyplot as plt

theta = np.linspace(0.0, 2 * np.pi, 4, endpoint=False)
radii = [90, 90, 90, 90]
width = np.pi / 4 * np.array([1.0, 0.7, 0.6, 0.2])

ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)

plt.show()

enter image description here

1 个答案:

答案 0 :(得分:3)

这个想法可以是在点的位置放置很多小的极轴。为此,可以使用mpl_toolkits.axes_grid1.inset_locator.inset_axes。这将放置在主轴(x)的数据坐标中指定的坐标ybbox_to_anchor=(x,y)bbox_transform=axis_main.transData)处。 loc参数应设置为" center" (loc=10),使极坐标图的中间位于(x,y)位置。

然后你可以在极轴上绘制你想要的任何东西。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.projections import get_projection_class

d = np.array([[ 1.0, 0.6, 0.8, 0.2, 56890, 98.67],
              [ 0.8, 0.3, 1.0, 0.5, 94948, 98.00],
              [ 1.0, 0.8, 0.1, 0.3, 78483, 97.13]])

fig, ax = plt.subplots()
ax.margins(0.15)


def plot_inset(data, x,y, axis_main, width ):
    ax_sub= inset_axes(axis_main, width=width, height=width, loc=10, 
                       bbox_to_anchor=(x,y),
                       bbox_transform=axis_main.transData, 
                       borderpad=0.0, axes_class=get_projection_class("polar"))

    theta = np.linspace(0.0, 2 * np.pi, 4, endpoint=False)
    radii = [90, 90, 90, 90]
    width = np.pi / 4 * data
    bars = ax_sub.bar(theta, radii, width=width, bottom=0.0)
    ax_sub.set_thetagrids(theta*180/np.pi, frac=1.4)
    ax_sub.set_xticklabels(["v{}".format(i) for i in range(1,5)])
    ax_sub.set_yticks([])


for da in d:    
    plot_inset(da[:4], da[4],da[5], ax, 0.5 )

#plot invisible scatter plot for the axes to autoscale
ax.scatter(d[:,4], d[:,5], s=1, alpha=0.0)

plt.show()

enter image description here