首页 > 解决方案 > Python/matplotlib:如何更改绘图中每个第 n 个数据点的颜色和/或符号?

问题描述

我对 Python 的体验非常基础。我编写了 Python 代码来从外部文件导入数据并执行计算。我的结果看起来像这样(实际上要大得多)。

1   1       
1   1957    
1   0.15        
2   346 
2   0.90
2   100
3   1920
3   100
3   40

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

1.第一列有“1”、“2”或“3”。所以首先我想让所有的“1”数据点变成圆形(例如),所有的“2”数据点都是其他符号,同样的“3”数据点也是如此。

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

所以我最终会得到一个只显示一个系列的图,但每个数据点看起来都不同。如果有人能指出我正确的方向,我将不胜感激。如果我没有说清楚,请告诉我,我会再试一次!

标签: pythonmatplotlibplotindexingcolors

解决方案


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

图片

代码

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()

来源:https ://matplotlib.org/3.1.1/gallery/lines_bars_and_markers/scatter_masked.html#sphx-glr-gallery-lines-bars-and-markers-scatter-masked-py


推荐阅读