Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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
在col-Python中绘制唯一标签的线_Python_Pandas_Matplotlib - Fatal编程技术网

在col-Python中绘制唯一标签的线

在col-Python中绘制唯一标签的线,python,pandas,matplotlib,Python,Pandas,Matplotlib,我试图传递一个函数,该函数为每个唯一的标签绘制各种对象。使用下面的df,A-D用于绘制各种对象。然后,我将标签中的每个唯一值传递给函数 我希望传递一种更有效的方法,即对列表中的每个唯一项调用函数。迭代列表,为标签中的每个唯一值生成一个单独的图形。使用下面的代码,这应该是3(X,Y,Z) 随着问题的发展,我修改了当前问题的代码轴[]使其成为一个数组。这是否如预期的那样 import pandas as pd import matplotlib.pyplot as plt import numpy

我试图传递一个函数,该函数为每个唯一的标签绘制各种对象。使用下面的df,
A-D
用于绘制各种对象。然后,我将
标签中的每个唯一值传递给函数

我希望传递一种更有效的方法,即对列表中的每个唯一项调用函数。迭代列表,为
标签中的每个唯一值生成一个单独的图形。使用下面的代码,这应该是3
(X,Y,Z)


随着问题的发展,我修改了当前问题的代码<编码>轴[]
使其成为一个数组。这是否如预期的那样

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):

    fig, axes = plt.subplots(1,3)

    for i,l in enumerate(label):

        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        axes[i].scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3)
        axes[i].scatter(x2, y2, c = 'green', marker = 'o', zorder = 2)

        axes[i].plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1) 
    fig.subplots_adjust(wspace=0.5)
    plt.show()  

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(0,20,size=(20, 4)), columns=list('ABCD'))
labels = df['A'].apply(lambda x: random.choice(['X', 'Y', 'Z']) ) 
df['label'] = labels

unq_label = df['label'].unique()
plot(df, unq_label)

随着问题的发展,我修改了当前问题的代码<编码>轴[]
使其成为一个数组。这是否如预期的那样

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):

    fig, axes = plt.subplots(1,3)

    for i,l in enumerate(label):

        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        axes[i].scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3)
        axes[i].scatter(x2, y2, c = 'green', marker = 'o', zorder = 2)

        axes[i].plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1) 
    fig.subplots_adjust(wspace=0.5)
    plt.show()  

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(0,20,size=(20, 4)), columns=list('ABCD'))
labels = df['A'].apply(lambda x: random.choice(['X', 'Y', 'Z']) ) 
df['label'] = labels

unq_label = df['label'].unique()
plot(df, unq_label)

@r-初学者已经解决了这个问题。在我的帖子中,我还将使用相同的(可能是唯一的)方法解决它,但使用另一个
Dataframe
来实现更好的可视化

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):
    
    label = sorted(label)
    fig, ax = plt.subplots(nrows=1,ncols=len(label),figsize=(12,6))

    for ind,l in enumerate(label):

        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        ax[ind].scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3,)
        ax[ind].scatter(x2, y2, c = 'green', marker = 'o', zorder = 2,)
        ax[ind].plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1,)
        ax[ind].set_title('class %s' % l)
        ax[ind].set_ylim(-11,21)

    plt.show()  

np.random.seed(2020)
x,y,z = np.random.randint(0,5,size=(5, 4)),np.random.randint(-10,0,size=(5, 4)),np.random.randint(10,20,size=(5, 4)),
data = np.vstack((x,y,z))
df = pd.DataFrame(data, columns=list('ABCD'))
df['label'] = ['X'] *5 + ['Y'] * 5 + ['Z'] * 5

unq_label = df['label'].unique()
plot(df, unq_label)
产出数字为


更新

为了在不同的图中绘制不同的标签,而不是子图,您可以尝试下面的代码。这个想法是为每个标签创建一个新的图形

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):
    
    label = sorted(label)
    for ind,l in enumerate(label):
        
        fig = plt.figure(ind)
        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        plt.scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3,)
        plt.scatter(x2, y2, c = 'green', marker = 'o', zorder = 2,)
        plt.plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1,)
        plt.title('class %s' % l)
        plt.ylim(-11,21)

        plt.show()  

np.random.seed(2020)
x,y,z = np.random.randint(0,5,size=(5, 4)),np.random.randint(-10,0,size=(5, 4)),np.random.randint(10,20,size=(5, 4)),
data = np.vstack((x,y,z))
df = pd.DataFrame(data, columns=list('ABCD'))
df['label'] = ['X'] *5 + ['Y'] * 5 + ['Z'] * 5

unq_label = df['label'].unique()
plot(df, unq_label)

@r初学者已经解决了这个问题。在我的帖子中,我还将使用相同的(可能是唯一的)方法解决它,但使用另一个
Dataframe
来实现更好的可视化

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):
    
    label = sorted(label)
    fig, ax = plt.subplots(nrows=1,ncols=len(label),figsize=(12,6))

    for ind,l in enumerate(label):

        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        ax[ind].scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3,)
        ax[ind].scatter(x2, y2, c = 'green', marker = 'o', zorder = 2,)
        ax[ind].plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1,)
        ax[ind].set_title('class %s' % l)
        ax[ind].set_ylim(-11,21)

    plt.show()  

np.random.seed(2020)
x,y,z = np.random.randint(0,5,size=(5, 4)),np.random.randint(-10,0,size=(5, 4)),np.random.randint(10,20,size=(5, 4)),
data = np.vstack((x,y,z))
df = pd.DataFrame(data, columns=list('ABCD'))
df['label'] = ['X'] *5 + ['Y'] * 5 + ['Z'] * 5

unq_label = df['label'].unique()
plot(df, unq_label)
产出数字为


更新

为了在不同的图中绘制不同的标签,而不是子图,您可以尝试下面的代码。这个想法是为每个标签创建一个新的图形

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

def plot(dfs, label):
    
    label = sorted(label)
    for ind,l in enumerate(label):
        
        fig = plt.figure(ind)
        df = dfs[dfs['label'] == l]

        x1 = df['A']
        y1 = df['B']

        x2 = df['C']
        y2 = df['D']

        plt.scatter(x1, y1, c = 'orange', marker = 'o', zorder = 3,)
        plt.scatter(x2, y2, c = 'green', marker = 'o', zorder = 2,)
        plt.plot([x1,x2],[y1,y2], color = 'k', linestyle = '-', linewidth = 1,)
        plt.title('class %s' % l)
        plt.ylim(-11,21)

        plt.show()  

np.random.seed(2020)
x,y,z = np.random.randint(0,5,size=(5, 4)),np.random.randint(-10,0,size=(5, 4)),np.random.randint(10,20,size=(5, 4)),
data = np.vstack((x,y,z))
df = pd.DataFrame(data, columns=list('ABCD'))
df['label'] = ['X'] *5 + ['Y'] * 5 + ['Z'] * 5

unq_label = df['label'].unique()
plot(df, unq_label)

我在以下行中得到一个错误:
ax.plot([ax,Cx],[By,Dy],color='k',linestyle='-',linewidth=1)
<代码>错误:键错误:0
打印(df)
查看数据是否存在。在这种情况下,如果在生成随机数之前设置
np.random.seed(2020)
,则调试更容易。它不会在我的环境中生成错误。你复制了所有的代码吗?是的,数据存在。我已经播下了种子。我想是每个标签上的商品数量。如果我将df长度增加到1000个值,它就会工作。但我希望为每个独特的标签绘制出单独的数字。我不确定情况如何随数据数量的变化而变化。另外,如果你想给它贴标签,你可以用
ax.text()
ax.annotate()
给它贴标签,但是如果它是一个大数字,它可能会使图形更混乱。我在这行上得到一个错误:
ax.plot([ax,Cx],[By,Dy],color='k',linestyle='-',linewidth=1)
<代码>错误:键错误:0
打印(df)
查看数据是否存在。在这种情况下,如果在生成随机数之前设置
np.random.seed(2020)
,则调试更容易。它不会在我的环境中生成错误。你复制了所有的代码吗?是的,数据存在。我已经播下了种子。我想是每个标签上的商品数量。如果我将df长度增加到1000个值,它就会工作。但我希望为每个独特的标签绘制出单独的数字。我不确定情况如何随数据数量的变化而变化。另外,如果你想给它贴标签,你可以用
ax.text()
ax.annotate()
给它贴标签,但是如果它是一个大数字,可能会使图表更混乱。我希望能生成输出图。因此,每个独特的标签都有一个单独的数字。在一个图中没有单独的子图。这是我想要的
df.groupby('label')。apply(plot,unq_label)
@jonboy我理解,请看我的更新帖子,想法是为每个独特的标签创建一个新的图。我希望生成输出图。因此,每个独特的标签都有一个单独的数字。在一个图中没有单独的子图。这是我在
df.groupby('label')之后所做的。应用(plot,unq_label)
@jonboy我理解,请参阅我的更新帖子,我的想法是为每个独特的标签创建一个新的图。