带matplotlib绘图的多色标记

带matplotlib绘图的多色标记,matplotlib,plot,Matplotlib,Plot,我试图绘制一个简单的图表,如果数据点为偶数,则标记为“x”(绿色),如果数据点为奇数,则标记为“o”(红色)。但是,图表的所有标记均显示为“o”,最后一个标记正确显示为“x”。请引导 import matplotlib.pyplot as plt a = [] b = [] for i in range( 1, 11 ): a.append( i ) b.append( i ) if ( i % 2 ) == 0: plt.plot( a, b

我试图绘制一个简单的图表,如果数据点为偶数,则标记为“x”(绿色),如果数据点为奇数,则标记为“o”(红色)。但是,图表的所有标记均显示为“o”,最后一个标记正确显示为“x”。请引导

import matplotlib.pyplot as plt

a = []
b = []

for i in range( 1, 11 ):
    a.append( i )
    b.append( i )
    if ( i % 2 ) == 0:
            plt.plot( a, b, "gx" )
    else:
            plt.plot( a, b, "ro" )

plt.show()

如果你仔细看,第一个标记不是红色的“o”,而是内部有绿色“x”的红色圆圈。您创建的for循环等效于:

plt.plot([1], [1], "ro")
plt.plot([1, 2], [1, 2], "gx")
plt.plot([1, 2, 3], [1, 2, 3], "ro")
(...)
因此,您将绘制10种不同的图形(技术上为对象)。对于i=10,绘制的最后一个对象是“gx”;它最终会落在其他的上面

以下是您的算法的更正版本(每个点绘制一个图):

不过,这里有一个更好的算法:

# use this one instead
import matplotlib.pyplot as plt

# Generate a, b outside the body of the loop
a = list(range(1,11))
b = list(range(1,11))

# Make one plot per condition branch
# See also https://stackoverflow.com/questions/509211/understanding-slice-notation
plt.plot(a[0::2], b[0::2], "gx")
plt.plot(a[1::2], b[1::2], "ro")

plt.show()

非常感谢您如此完美的回答和澄清!
# use this one instead
import matplotlib.pyplot as plt

# Generate a, b outside the body of the loop
a = list(range(1,11))
b = list(range(1,11))

# Make one plot per condition branch
# See also https://stackoverflow.com/questions/509211/understanding-slice-notation
plt.plot(a[0::2], b[0::2], "gx")
plt.plot(a[1::2], b[1::2], "ro")

plt.show()