【问题标题】:Pandas Pyplot Multiple Markers, same linePandas Pyplot 多个标记,同一行
【发布时间】:2017-08-27 06:23:47
【问题描述】:

我有一个 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

你好吗:

  1. 使用 matplotlib.pyplot 绘制一条线 (t1, c_1)
  2. 并以特定样式(例如,绿色)在线上标记 (c_2) 中的每个对应点
  3. 并且还将 (c_3) 中的每个点以另一种样式(例如蓝色)标记在同一行上
  4. 然后画一条虚线连接标记 (t1, t3), t3, t6) 和 (t5, t6)

我将问题分解为多个点,以便于阅读,但本质上我对 pyplot 还是很陌生,而且我找不到用相同语法设置 2 个不同标记的方法。我也不太确定如何操作标记,如果可能的话..

完成此任务的“通常”方法是什么?

【问题讨论】:

  • @splinter,你在 stackoverflow 上似乎不清楚很多问题。很明显,Time 列下的 t1 表示时间(即日期时间,而不是字符串)plt.plot(df['c_1']) 是一个有效的操作,可以根据时间绘制值。如果没有,执行df.reset_index() 的建设性建议会有所帮助。

标签: python python-2.7 pandas matplotlib


【解决方案1】:

假设你有这个数据框:

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

【讨论】:

  • 是否有理由将 df 索引重置为远离日期时间索引?如果我想在绘图上显示日期时间,我是否有权绘制 (time, value) 并传递一个有效的 (time, value) 坐标标记,它会达到与上述相同的结果吗?
  • 我没有重置任何东西。由于您没有共享任何实际数据框,因此我需要发明一个。
  • 哦,好吧。我现在了解这项技术。感谢分享!
猜你喜欢
  • 2016-07-27
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多