matplotlib scatterplot:通过标记形状添加第四维

时间:2015-06-21 12:56:51

标签: python matplotlib

我想通过根据变量定义标记的椭圆度来为散点图添加第四维。这有可能吗?

编辑:

我想避免3D情节。在我看来,这些情节通常不是很有用。

3 个答案:

答案 0 :(得分:1)

您可以使用colorbar作为3D绘图的第4维。一个例子如下所示:

import matplotlib.cm as cmx
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib
import numpy as np

def scatter3d(x,y,z, cs, colorsMap='jet'):
    cm = plt.get_cmap(colorsMap)
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs))
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(x, y, z, c=scalarMap.to_rgba(cs))
    scalarMap.set_array(cs)
    fig.colorbar(scalarMap,label='Test')
    plt.show()

x = np.random.uniform(0,1,50)
y = np.random.uniform(0,1,50)
z = np.random.uniform(0,1,50)

所以scatter3D(x,y,z,x+y)产生:

x+y是第四维的颜色。您可以根据特定变量而不是x+y添加计算出的椭圆度,以获得所需内容。

enter image description here

答案 1 :(得分:1)

要更改标记的椭圆度,您必须手动创建它们,因为尚未实现此功能。但是,我相信您可以使用颜色和大小作为附加尺寸,使用2D散点图显示4个尺寸。您必须自己处理从数据到标记大小的缩放。我在下面的例子中添加了一个简单的函数来处理它:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(60,4)

def scale_size(data, data_min=None, data_max=None, size_min=10, size_max=60):

    # if the data limits are set to None we will just infer them from the data
    if data_min is None:
        data_min = data.min()
    if data_max is None:
        data_max = data.max()

    size_range = size_max - size_min
    data_range = data_max - data_min

    return ((data - data_min) *  size_range / data_range) + size_min


plt.scatter(data[:,0], data[:,1], c=data[:,2], s=scale_size(data[:,3]))
plt.colorbar()
plt.show()

结果:

enter image description here

答案 2 :(得分:1)

您可以将DbProviderFactories.GetFactory(WebConfigurationManager .ConnectionStrings[name].ProviderName); 个补丁直接放在轴上,如this matplotlib example所示。使其适应使用偏心率作为你的第三维度#);)保持标记区域不变:

Ellipse

enter image description here

当然,在这种情况下,您需要将标记区域缩放到x,y值。