Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib:三维散点图无法识别标签_Python_Python 2.7_Matplotlib - Fatal编程技术网

Python Matplotlib:三维散点图无法识别标签

Python Matplotlib:三维散点图无法识别标签,python,python-2.7,matplotlib,Python,Python 2.7,Matplotlib,我相信之前也有人问过类似的问题,但这并没有真正为我澄清问题 基本上,我有一个元组列表,每个元组作为一个点,例如x,y,z 在运行聚类算法对点进行颜色编码后,我想在2D或3D中绘制它们 clusters = [] def plotPoints(self): fig = plt.figure() if self.clusters[0].dimensions == 2: ax = fig.add_subplot(111) for i in range(0

我相信之前也有人问过类似的问题,但这并没有真正为我澄清问题

基本上,我有一个元组列表,每个元组作为一个点,例如x,y,z

在运行聚类算法对点进行颜色编码后,我想在2D或3D中绘制它们

clusters = []
def plotPoints(self):
    fig = plt.figure()
    if self.clusters[0].dimensions == 2:
        ax = fig.add_subplot(111)
        for i in range(0, len(self.clusters)):
            ax.scatter(*zip(*self.clusters[i].points), c=self.clusters[i].color, marker="o", label=("Cluster " + str(i + 1)))
        plt.legend(loc='upper left')
        plt.show()
    elif self.clusters[0].dimensions == 3:
        ax = fig.add_subplot(111, projection='3d')
        for i in range(0, len(self.clusters)):
            ax.scatter(*zip(*self.clusters[i].points), c=self.clusters[i].color, marker="o", label=("Cluster " + str(i + 1)))
        plt.legend(loc='upper left')
        plt.show()
    else:
        print "Cannot plot in dimensions lower than 2 or higher than 3"
群集类别:

class Cluster(object):
centroid = ()
dimensions = 0
color = 'k'

def __init__(self, init_pt, color):
    self.points = []
    self.points.append(init_pt)
    self.dimensions = len(init_pt)
    self.centroid = init_pt
    self.color = color

def addPoint(self, pt):
    try:
        if len(pt) != self.dimensions:
            raise ArithmeticError("Wrong number of dimensions on new point, ignoring")
        else:
            centroid_dim_list = []
            for dim in range(0, self.dimensions):
                centroid_dim_list.append((self.centroid[dim] * len(self.points) + pt[dim]) / float(len(self.points) + 1))
            self.centroid = tuple(centroid_dim_list)
            self.points.append(pt)
    except ArithmeticError as ae:
        print ae.message
        pass
2D打印效果很好,看起来也很不错,但3D打印给了我一个警告:

UserWarning: No labeled objects found. Use label='...' kwarg on individual plots.
  warnings.warn("No labeled objects found. "

并且没有出现任何图例。但是我正在标记这些点,并且我使用的代码几乎是相同的,所以我对问题所在感到困惑。我听说了一些关于代理对象的事情,但我不知道如何在这种情况下使用它。

我不确定self.clusters的格式是什么,但我想到了一些与它非常相似的东西,我能够产生以下结果:

使用代码

for i,c in enumerate(self.clusters):
    x,y,z = c.points
    ax.text(x,y,z, "Cluster %d" % (i+1), None)
根据

我正在使用matplotlib 1.4.3


请注意,您将无法拖放此代码,因为我的群集实例是简单的3元组,而您的群集实例似乎更复杂。

我不确定self.clusters的格式是什么,但由于我想到了一些与之非常相似的东西,我能够生成以下内容:

使用代码

for i,c in enumerate(self.clusters):
    x,y,z = c.points
    ax.text(x,y,z, "Cluster %d" % (i+1), None)
根据

我正在使用matplotlib 1.4.3


请注意,您将无法拖放此代码,因为我的群集实例是简单的3元组,而您的实例似乎更复杂。

我通过添加以下代码部分解决了我的问题:

ax.plot([], [], 'o', c=self.clusters[i].color, label="Cluster " + str(i + 1))
对于循环的每个迭代,给出下图

由于某种原因,该标记会加倍,但至少在大多数情况下是有效的。如果有人能评论为什么它翻了一倍,那就太好了

编辑 根据jedwards的评论,我将图例调用更改为:

plt.legend(numpoints=1 , loc='upper left')

我通过添加以下代码部分解决了问题:

ax.plot([], [], 'o', c=self.clusters[i].color, label="Cluster " + str(i + 1))
对于循环的每个迭代,给出下图

由于某种原因,该标记会加倍,但至少在大多数情况下是有效的。如果有人能评论为什么它翻了一倍,那就太好了

编辑 根据jedwards的评论,我将图例调用更改为:

plt.legend(numpoints=1 , loc='upper left')

我可能不完全理解你的问题,但这里有一个例子,你可以调整它到你的情况。希望有帮助:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from random import randint

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# dataset
def data():
    return [randint(0,100) for _ in range(10)]

c1 = (data(), data(), data())
c2 = (data(), data(), data())
c3 = (data(), data(), data())
clusters = [c1, c2, c3]

# plot 
colors = ['r', 'b', 'y', 'c']
for i, c in enumerate(clusters):
    ax.scatter(c[0], c[1], c[2], c=colors[i], label='cluster {}'.format(i))

ax.legend(bbox_to_anchor = (1.5, 1))
plt.show()
它产生了以下结果:
我可能不完全理解你的问题,但这里有一个例子,你可以根据自己的情况调整一下。希望有帮助:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from random import randint

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# dataset
def data():
    return [randint(0,100) for _ in range(10)]

c1 = (data(), data(), data())
c2 = (data(), data(), data())
c3 = (data(), data(), data())
clusters = [c1, c2, c3]

# plot 
colors = ['r', 'b', 'y', 'c']
for i, c in enumerate(clusters):
    ax.scatter(c[0], c[1], c[2], c=colors[i], label='cluster {}'.format(i))

ax.legend(bbox_to_anchor = (1.5, 1))
plt.show()
它产生了以下结果:

您使用的matplotlib版本是什么?我想是使用1.3.1版。这是我的linux版本可以从repo获得的版本。您使用的matplotlib版本是什么?我想是使用1.3.1版。这是我的linux版本可以从repo获得的版本。我的集群是3元组列表,我有一个集群列表,所以它可能会工作。我不想显示文本标签。我将在问题中包含更多代码。尝试过了,在图表上显示了标签,但我只想让图例起作用,它仍然显示相同的警告。我的集群是3元组列表,我有一个集群列表,所以它可能会起作用。我不想显示文本标签。我将在问题中包含更多代码。尝试过了,在图表上显示了标签,但我只希望图例正常工作,并且它仍然显示相同的警告。re:double markers,请参阅re:double markers,请参阅