Python/matplotlib:如何更改绘图中每N个数据点的颜色和/或符号?

Python/matplotlib:如何更改绘图中每N个数据点的颜色和/或符号?,python,matplotlib,plot,indexing,colors,Python,Matplotlib,Plot,Indexing,Colors,我对Python的经验非常基础。我已经编写了Python代码来从外部文件导入数据并执行计算。我的结果看起来像这样(除了现实中更大) 我想做的是将这两列绘制为一个系列,然后根据特定模式区分每个数据点。我知道这听起来不必要的复杂,但我需要做一些事情来帮助那些将使用我的代码的人。不幸的是,我的Python技能在这里让我失望。更具体地说: 1。第一列有“1”、“2”或“3”。因此,首先我想将所有“1”数据点做成圆圈(例如,“2”数据点变成其他符号,同样地,对于“3”数据点也是如此 2.下一步。每个不同的

我对Python的经验非常基础。我已经编写了Python代码来从外部文件导入数据并执行计算。我的结果看起来像这样(除了现实中更大)

我想做的是将这两列绘制为一个系列,然后根据特定模式区分每个数据点。我知道这听起来不必要的复杂,但我需要做一些事情来帮助那些将使用我的代码的人。不幸的是,我的Python技能在这里让我失望。更具体地说:

1。第一列有“1”、“2”或“3”。因此,首先我想将所有“1”数据点做成圆圈(例如,“2”数据点变成其他符号,同样地,对于“3”数据点也是如此

2.下一步。每个不同的数字有三行。所以对于“1”,第二列中的“0.15”是平均值,“1957”是最大值,“1”是最小值。我希望将与每个数字的平均值(每个数字的顶行)关联的数据点设置为绿色(例如)。我希望最大值和最小值也有自己的颜色


因此,我将以一个只显示一个系列的图结束,但每个数据点看起来不同。如果有人能为我指出正确的方向,我将不胜感激。如果我没有说清楚,请让我知道,我会再试一次

我要做的是将数据分成三个不同的列,这样就有了几个系列。然后我会使用不同标记的plt.scatter来获得想要的效果

代码

导入matplotlib.pyplot作为plt
将numpy作为np导入
#为再现性确定随机状态
np.随机种子(196801)
N=100
r0=0.6
x=0.9*np.rand.rand(N)
y=0.9*np.rand.rand(N)
面积=(20*np.rand.rand(N))**2#0到10点半径
c=np.sqrt(面积)
r=np.sqrt(x**2+y**2)
面积1=np.ma.掩蔽,其中(r=r0,区域)
plt.散射(x,y,s=Area 1,marker='^',c=c)
plt.散射(x,y,s=区域2,标记='o',c=c)
#显示区域之间的边界:
θ=np.arange(0,np.pi/2,0.01)
平面图(r0*np.cos(θ),r0*np.sin(θ))
plt.show()
资料来源:


对于不同的标记样式,当前需要创建不同的打印实例(请参见)。通过将数组作为
color
参数传递,可以使用不同的颜色。例如:

import matplotlib.pyplot as plt
import numpy as np

data = np.array([
    [1, 0.15],
    [1, 1957],
    [1, 1],
    [2, 346],
    [2, 0.90],
    [2, 100],
    [3, 1920],
    [3, 100],
    [3, 40],
])
x, y = np.transpose(data)

symbols = ['o', 's', 'D']
colors = ['blue', 'orange', 'green']

for value, marker in zip(np.unique(x), symbols):
    mask = (x == value)
    plt.scatter(x[mask], y[mask], marker=marker, color=colors)
plt.show()

这能解决你的问题吗?谢谢你,Sameeresque。我不认为是这样,但也许我是一个新手,我不了解一些东西。我认为链接中的Python示例处理的是已经不同的序列(如“性别”),而不是单个序列中的点。您能否提供一个示例说明您的计算结果,上表不太直观,我将这样做,StupidWolf。谢谢你的邀请。可能需要一点时间…@user3292696关于您的数据,
min,mean,max=1,0.151957
,平均值怎么可能小于最小值?非常感谢您,Sritej。但是,如果我正确理解了您的代码(我可能没有——我对Python没有太多经验),那么我需要将我的系列分开。不幸的是,我不能那样做。不过,谢谢你!将其保留在单个系列中的一个解决方法是分别绘制此处显示的每个点:
import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)


N = 100
r0 = 0.6
x = 0.9 * np.random.rand(N)
y = 0.9 * np.random.rand(N)
area = (20 * np.random.rand(N))**2  # 0 to 10 point radii
c = np.sqrt(area)
r = np.sqrt(x ** 2 + y ** 2)
area1 = np.ma.masked_where(r < r0, area)
area2 = np.ma.masked_where(r >= r0, area)
plt.scatter(x, y, s=area1, marker='^', c=c)
plt.scatter(x, y, s=area2, marker='o', c=c)
# Show the boundary between the regions:
theta = np.arange(0, np.pi / 2, 0.01)
plt.plot(r0 * np.cos(theta), r0 * np.sin(theta))

plt.show()

import matplotlib.pyplot as plt
import numpy as np

data = np.array([
    [1, 0.15],
    [1, 1957],
    [1, 1],
    [2, 346],
    [2, 0.90],
    [2, 100],
    [3, 1920],
    [3, 100],
    [3, 40],
])
x, y = np.transpose(data)

symbols = ['o', 's', 'D']
colors = ['blue', 'orange', 'green']

for value, marker in zip(np.unique(x), symbols):
    mask = (x == value)
    plt.scatter(x[mask], y[mask], marker=marker, color=colors)
plt.show()