当前位置: 首页 > 知识库问答 >
问题:

Matplotlib:在两点之间绘制直线。。。但是以一种不寻常的方式

龙高歌
2023-03-14

我正在学习使用Matplotlib可视化数据,我想以非常定制的方式绘制一条线。我是Matplotlib新手,我不知道我想做的事情是否可能。下面是:

设置:假设你有一组随机的(x,y)点作为线图。为了便于说明,我将4个不同的线图压缩成一个图,但是想象一下,如果下面的4行中的每一行都被分解成各自的图。

[![在此输入图像描述][1]][1]

步骤1)对于每个折线图A、B、C、D,转到全局最大值并将其称为“X”。

步骤4(可能吗?)画一条连接“X”和“Y”的线。可以在matplotlib中绘制这条线吗?非常感谢。

相关代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(50, 4), 
        index=pd.date_range('1/1/2000', periods=50), columns=list('ABCD'))
df = df.cumsum()
df.plot();

共有1个答案

孔棋
2023-03-14

我认为你需要定义计算局部最大值的特定逻辑,而不仅仅是使用“时钟”比喻,但是一旦你用“代码”、“代码”熊猫或其他库定义了这个逻辑,你就可以像我一样创建一个数据帧。从那里,你应该能够从下面产生结果。

如果您可以使用seborn(构建在matplotlib之上),我认为这会更容易一点,因为您可以通过hue参数在一行中为每个类别创建所有行的代码。您需要使用要绘制的这些创建一个新的数据帧。我通过对值进行排序并获得每个组的尾部值来做到这一点。见下面可重复的例子。

示例1(绘制局部最大值):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns
fig, ax = plt.subplots()
plt.style.use('classic')
df = pd.DataFrame(np.random.randn(50, 4), 
        index=pd.date_range('1/1/2000', periods=50), columns=list('ABCD'))
df = df.cumsum()
df = df.melt(ignore_index=False).reset_index()
sns.lineplot(data=df, x="index", y="value", hue="variable", ax=ax)
lines_max = (df.sort_values('value').groupby("variable").tail(1)).sort_values('variable')
lines_local_max = df[((df['variable'] == lines_max['variable'].iloc[0]) & (df['index'] > lines_max['index'].iloc[0]))
                | ((df['variable'] == lines_max['variable'].iloc[1]) & (df['index'] > lines_max['index'].iloc[1]))
                | ((df['variable'] == lines_max['variable'].iloc[2]) & (df['index'] > lines_max['index'].iloc[2]))
                | ((df['variable'] == lines_max['variable'].iloc[3]) & (df['index'] > lines_max['index'].iloc[3]))]
lines_local_max = (lines_local_max.sort_values(['variable', 'value']).groupby("variable").tail(1))
lines = lines_max.append(lines_local_max).sort_values('variable')
lines
sns.lineplot(data=lines, x="index", y="value", hue="variable", marker="o",
             style='variable', dashes=[(2, 2), (2, 2), (2, 2), (2, 2)], legend=False, ax=ax)
x_dates = pd.to_datetime(df['index'].unique())
plt.xticks(x_dates[0::7], rotation=45, ha='center')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b-%d-%Y'))

例2(只是画一条线到最后,而不是定义局部最大值——目的只是向你展示如何从最大点到另一个定义点画一条线):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.style.use('classic')
fmri = sns.load_dataset("fmri")
fmri = fmri.groupby(['event', 'timepoint'], as_index=False)['signal'].mean()
sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event")
lines_max = (fmri.sort_values('signal').groupby("event").tail(1))
lines_last = (fmri.sort_values('timepoint').groupby("event").tail(1))
lines = lines_max.append(lines_last)
sns.lineplot(data=lines, x="timepoint", y="signal", hue="event", marker="o", style='event', dashes=[(2, 2), (2, 2)])

示例3(另一个示例使用您提供的数据绘制一条线,但不定义局部最大值-目的只是向您展示如何从最大值点到另一个定义点绘制一条线):使用您提供的数据示例:

import pandas as pd
import numpy as np
fig, ax = plt.subplots()
df = pd.DataFrame(np.random.randn(50, 4), 
        index=pd.date_range('1/1/2000', periods=50), columns=list('ABCD'))
df = df.cumsum()
df = df.melt(ignore_index=False).reset_index()
sns.lineplot(data=df, x="index", y="value", hue="variable", ax=ax)
lines_max = (df.sort_values('value').groupby("variable").tail(1))
lines_last = (df.sort_values('index').groupby("variable").tail(1))
lines = lines_max.append(lines_last).sort_values('variable')
sns.lineplot(data=lines, x="index", y="value", hue="variable", marker="o",
             style='variable', dashes=[(2, 2), (2, 2), (2, 2), (2, 2)], legend=False, ax=ax)
x_dates = df['index'].dt.strftime('%Y-%m-%d').sort_values().unique()
ax.set_xticklabels(labels=x_dates, rotation=45, ha='center')
 类似资料:
  • 我正在研究一个依赖图,它由多个节点和图中从一个节点到另一个节点的多条有向边组成。 我试图通过添加n个节点作为圆和这些节点之间的边作为线来绘制图形的可视化。 我使用图形库的Java随着JGroup和Jframe。 这是我目前编写的代码: 我能画两个圆和一条线,但我遇到的问题是用一条边连接这两个圆。 我在画布上的随机位置绘制了每个节点,并想在这两个节点之间添加一条线。这条线有Point1(x1, y1

  • 我正在使用python中的matplotlib绘制直方图,并希望绘制一条代表数据集平均值的线,以虚线的形式覆盖在直方图上(或者其他颜色也可以)。关于如何在柱状图上画一条线有什么想法吗? 我正在使用plot()命令,但不确定如何绘制垂直线(即,我应该为y轴指定什么值? 谢谢

  • 本文向大家介绍python matplotlib 在指定的两个点之间连线方法,包括了python matplotlib 在指定的两个点之间连线方法的使用技巧和注意事项,需要的朋友参考一下 为了找到matplotlib在两个点之间连线的方法真是费了好大功夫,最后还是决定用简单的 plt.plot 来解决。如果有好多对点,则可以通过循环实现连接,还可以用 plt.arrow 画箭头,具体可参考这里 画

  • 我有一个从pandas数据框创建的直方图,我想绘制一条代表数据集平均值的垂直虚线。我已经回顾了这个线程,这正是我正在寻找的样式,但是,我不知道如何使它与我的代码一起工作(如下所示): 我最终收到了以下错误: 不知道这意味着什么,任何帮助都将不胜感激。 编辑:我的数据文件是一个有一列的csv,第一行是一个标题(字符串),所有后续的107行都是从app开始的值。1.0E 11至4.0E 11 假数据(

  • numpy.histogram()函数将输入数组和作为两个参数。 bin数组中的连续元素用作每个bin的边界。 Matplotlib 可以将直方图的数字表示转换为图形。 pyplot子模块的plt()函数将包含数据和数组的数组作为参数,并转换为直方图。

  • 本文向大家介绍php绘制一条直线的方法,包括了php绘制一条直线的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php绘制一条直线的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。