Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 Matplotlib:如何绘制字典对的带标签线图?_Python_Python 3.x_Matplotlib_Plot - Fatal编程技术网

Python Matplotlib:如何绘制字典对的带标签线图?

Python Matplotlib:如何绘制字典对的带标签线图?,python,python-3.x,matplotlib,plot,Python,Python 3.x,Matplotlib,Plot,我有一个时间序列数据字典,其结构如下: # {"second": [size, label]} dict = {0.6: [100, 0], 1.1: [120, 1], 1.8: [220, 2]} 上面的字典跟踪大小和标签,直到相应的秒。考虑到上面的示例,我想在同一个图中绘制线: 秒之间标签0的绿线:(0,0.6] (含0.6) 标签1在秒之间的蓝线:(0.6,1.1] (不包括0.6,包括1.1) 秒之间标签2的红线:(1.1,1

我有一个时间序列数据字典,其结构如下:

# {"second": [size, label]}
dict = {0.6: [100, 0],
        1.1: [120, 1],
        1.8: [220, 2]}
上面的字典跟踪大小和标签,直到相应的秒。考虑到上面的示例,我想在同一个图中绘制线:

  • 秒之间标签0的绿线:(0,0.6]
    (含0.6)

  • 标签1在秒之间的蓝线:0.6,1.1]
    (不包括0.6,包括1.1)

  • 秒之间标签2的红线:1.1,1.8]

    (不包括1.1,包括1.8)

我在字典中有许多数据点,大约10分钟的数据。我计划分割x轴,例如,每10秒分割一次,因此上面的数据将在整个图形中显示为微小的尖峰。我不能在这种情况下使用散射,在时间[0到n]上应该有一个折线图(由具有不同标签(颜色)的不同图形组成,如上所述)

这是通过使用matplotlib实现的,还是需要找到另一种方法?
谢谢!

plt。plot
默认情况下在给定位置之间绘制线条。由于每次调用时仅给出一个点,因此不会绘制线条。
plt.scatter
可以使用给定颜色绘制一个(或多个)点

您可以先将所有x值和所有y值收集到列表中,然后绘制线图(
plt.plot
)。如果您想要阶跃函数,可以使用
plt.step
。在这些线的顶部可以绘制彩色点(
plt.scatter
),或者可以通过
plt.plt.plot([x_0,x_1],[y,y])
)绘制短线

以下是一个例子:

导入matplotlib.pyplot作为plt
从matplotlib.ticker导入MultipleLocator
dict={0.22:[100,0],
0.68: [180, 1],
1.12: [210, 2]}
legendMap={0:[“蓝色”,“A”],
1:[“红色”、“B”],
2:[“绿色”,“C”]}
x=列表(dict.keys())
x、 sort()#如果值不排序,则需要
X=席席[XI]〔0〕
#如果不需要垂直线,请省略下面的一行
plt.step([0]+x[y[0]]+y,color='black',ls='':',lw=0.5,其中='pre')
已使用\u图例\u id=set()
对于拉链中的xi0、xi1、yi([0]+x[:-1],x,y):
图例_id=dict[xi1][1]
颜色,标签=legendMap[图例id]
如果使用了图例标识中的图例标识:
标签=无
其他:
已使用的\u图例\u id.add(图例\u id)
plt.plot([xi0,xi1],[yi]*2,颜色=颜色,标签=标签)
plt.xticks(x)
plt.gca()
plt.legend()
plt.show()

PS:若要绘制条形图而不是水平线,可以替换

plt.plot([xi0,xi1],[yi]*2,颜色=颜色,标签=标签)

plt.bar(xi0,yi,width=xi1-xi0,align='edge',color=color,label=label,alpha=0.4)
甚至可以同时使用条和行(在这种情况下,您应该省略两个
label=label
参数中的一个,以避免出现双图例)

要绘制注释图,您可以通过
y
进行迭代,类似于通过
x

for xi0, xi1, yi0, yi1 in zip([0] + x[:-1], x, [0] + y[:-1], y):
    legend_id = dict[xi1][1]
    color, label = legendMap[legend_id]
    if legend_id in used_legend_ids:
        label = None
    else:
        used_legend_ids.add(legend_id)
    plt.plot([xi0, xi1], [yi0, yi1], color=color, label=label)

谢谢你清楚的解释!但是,在处理我的问题时,我意识到我的问题解释错了。我刚刚编辑了这个问题,你能看一下吗?谢谢你的时间!太近了!:)区别在于,从第二个0到第二个0.22之间的y=100,从第二个0.22到第二个0.68之间的y=180,等等。是的,{“second”:[size,label]}表示“size”是从前一秒开始到“second”类型的数据的大小,前一秒显然是0。您可以省略对
plt.step(..)的调用
如果您不需要垂直线。您可以使用
多路显示器来设置轴上的多个或少个刻度。我刚刚添加了一个示例。我添加了一些可能的代码来绘制条形图而不是水平线。您期望的y值是什么?对于这些x范围?在示例中,在秒(0,0.6)(包括0.6)之间的y=100y=120秒之间(0.6,1.1)(不包括0.6,包括1.1)y=220秒之间(1.1,1.8)(不包括1.1,包括1.8)@JohanC I仍然有一个标签字典,可以根据id获取相关标签名称。