我有一个包含五个变量和一个因变量的数据集。一个样本是:
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
我想直观地表示所有五个变量和因变量之间的关系。为此,我考虑将两种类型的图组合在一起:
s
和a
v1
,v2
,v3
和v4
所以基本上我想为我的数据集中的每个数据点显示一个小的极坐标图。像这样:
示例极坐标图是:
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()
答案 0 :(得分:3)
这个想法可以是在点的位置放置很多小的极轴。为此,可以使用mpl_toolkits.axes_grid1.inset_locator.inset_axes
。这将放置在主轴(x
)的数据坐标中指定的坐标y
,bbox_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()