Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 绘制多个标记,同一行_Python_Python 2.7_Pandas_Matplotlib - Fatal编程技术网

Python 绘制多个标记,同一行

Python 绘制多个标记,同一行,python,python-2.7,pandas,matplotlib,Python,Python 2.7,Pandas,Matplotlib,我有一个df: time c_1 c_2 c_3 t1 v1 NaN t1 t2 v2 NaN NaN t3 v3 t3 NaN t4 v4 NaN NaN t5 v5 t5 NaN t6 v6 NaN t6 你如何: 使用matplotlib.pyplot绘制直线(t1,c_1) 并以特定样式(例如绿色)标记线上(c_

我有一个df:

time    c_1    c_2   c_3
 t1      v1    NaN    t1
 t2      v2    NaN    NaN   
 t3      v3    t3     NaN 
 t4      v4    NaN    NaN 
 t5      v5    t5     NaN 
 t6      v6    NaN    t6
你如何:

  • 使用matplotlib.pyplot绘制直线(t1,c_1)
  • 并以特定样式(例如绿色)标记线上(c_2)中的每个对应点
  • 并用另一种样式(比如蓝色)在同一条线上标记(c_3)中的每个点
  • 然后画一条虚线连接标记(t1、t3、t3、t6)和(t5、t6)
  • 为了便于阅读,我把问题分成了几点,但本质上我对pyplot非常陌生,我找不到一种方法来用相同的语法设计两个不同的标记。如果可能的话,我也不太确定如何操作标记


    实现这一点的“常用”方法是什么?

    假设您有以下数据帧:

            c_1  c_2  c_3  time
    0  0.548814  NaN  1.0     1
    1  0.715189  NaN  NaN     2
    2  0.602763  3.0  NaN     3
    3  0.544883  NaN  NaN     4
    4  0.423655  5.0  NaN     5
    5  0.645894  NaN  6.0     6
    
    如果下面的情节是你想要的

    它可以使用以下代码生成:

    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np; np.random.seed(0)
    
    time = np.arange(1,7)
    c_1 = np.random.rand(6)
    c_2 = time*np.array([np.nan, np.nan, 1, np.nan, 1, np.nan])
    c_3 = time*np.array([1, np.nan, np.nan, np.nan, np.nan, 1])
    
    df = pd.DataFrame({"time":time, "c_1":c_1,"c_2":c_2,"c_3":c_3 })
    
    ax = df.plot("time", "c_1")
    ax.plot(df["c_2"], df["c_1"], marker="s", color="limegreen",  linestyle="")
    ax.plot(df["c_3"], df["c_1"], marker="o", color="crimson", linestyle="")
    
    # to be able to draw a line with coordinates 
    # from two different columns, we need to join them
    df2 = df[["c_1","c_2"]].dropna()
    df3 = df[["c_1","c_3"]].dropna().rename(columns = {'c_3':'c_2'}, inplace = False)
    df4 = pd.concat([df2, df3]).sort_values(by=["c_2"])
    
    ax.plot(df4["c_2"], df4["c_1"], color="burlywood",  linestyle=":", lw=2.5)
    
    ax.set_xlim(0,7)
    plt.show()
    

    @斯普林特,你对stackoverflow的很多问题都不清楚。很明显,列时间下的t1表示时间(即日期时间,而不是字符串),并且
    plt.plot(df['c_1'])
    是一个有效的操作,可以根据时间绘制值。如果没有,执行
    df.reset_index()
    的建设性建议将很有帮助。是否有理由将df索引从日期时间索引中重置?如果我想在绘图上显示日期时间,我是否正确地绘图(时间,值)并传递一个有效的(时间,值)坐标标记,它将获得与上述相同的结果?我没有从任何其他位置重置任何内容。因为你们并没有共享任何实际的数据帧,所以我需要发明一个。我现在懂技术了。谢谢分享!