Python 在matplotlib绘图中的特定日期添加圆

Python 在matplotlib绘图中的特定日期添加圆,python,matplotlib,Python,Matplotlib,我使用以下代码绘制了matpltolib图: ax.plot(df_c.index, y1, color='b') 这里的df_c.索引是: 上面的代码生成一个线图 我想在此日期“2020-04-12”上添加一个值为100的圆圈。我该怎么做?我试过: ax.plot(datetime.date(2020, 04, 12), 100, 'bo') 但它不起作用。我如何解决它呢?我不完全确定你想在哪里画圆圈,但我在这里展示了三个不同的圆圈位置,以及一个简单的第四个选项,仅用于突出显示特定日期。演

我使用以下代码绘制了matpltolib图:

ax.plot(df_c.index, y1, color='b')
这里的df_c.索引是:

上面的代码生成一个线图

我想在此日期“2020-04-12”上添加一个值为100的圆圈。我该怎么做?我试过:

ax.plot(datetime.date(2020, 04, 12), 100, 'bo')

但它不起作用。我如何解决它呢?

我不完全确定你想在哪里画圆圈,但我在这里展示了三个不同的圆圈位置,以及一个简单的第四个选项,仅用于突出显示特定日期。演示图像显示在底部。首先,让我们绘制一些数据:

import matplotlib.pyplot as plt

dates = ['2019-10-31', '2019-11-01', '2019-11-02', '2019-11-03']

y = [i*i for i in range(len(dates))] # some random y values

# An arbitrary date value to encircle 
encircled_date = dates[1]
val_of_encircled_date = y[1]

# Plot the graph
fig, ax = plt.subplots()
ax.plot_date(dates,y,'-')
bottom, top = plt.ylim() # Later, we'll need the min value of the y-axis for correct positioning of circle
现在,如果你只想在图表上画一个圆,当它经过你的特定日期时,最简单也是最好的方法就是简单地用markerstyle='o'回复这个特定的值。根据您的喜好调整标记大小、线宽和颜色:

# Plot a circle around specific graph value
ax.plot_date(encircled_date, val_of_encircled_date,
                'og', # marker style 'o', color 'g'
                fillstyle='none', # circle is not filled (with color)
                ms=10.0) # size of marker/circle
然后,如果你想要在日期记号周围画一个圆圈,在你的特定日期的x轴上,根据你需要圈出的细节,这会有点棘手。当然,您可以使用上述方法仅在刻度周围画一个小圆圈,但我将展示一种基于另一种方法的更高级方法:

上面的解决方案仅包围勾号,而不是日期标签本身。通过调整两个偏移参数,我们可以微调圆以适应内部的日期标签

# Plot a circle around the specific date's label on the x-axis
pos_offset = 0.5
len_offset = 0.4
circle2 = plt.Circle((encircled_date, bottom-pos_offset), # position
                    (1.0+len_offset) / len(dates), # radius
                    color='purple',
                    clip_on=False, # allow drawing outside of axis
                    fill=False)
ax.add_artist(circle2)
但是,此调整可能是一项乏味的任务。如果您的目标只是强调这个特定日期,那么最好只是重新配置x标签。例如,您可以像这样更改标签的颜色

ax.get_xticklabels()[2].set_color("red")
ax.get_xticklabels()[2].set_weight("bold")
下图显示了四种不同的方法。我希望这有帮助

最后一句话:当你得到一个人口稠密的x轴日期,它可能是值得研究更先进的格式的日期标签,你可以阅读所有关于在。例如,它们显示了如何整齐地旋转标签,使它们更紧密地结合在一起而不重叠


我不完全确定你想在哪里画圆圈,但我在这里展示了三个不同的圆圈位置,以及一个简单的第四个选择,只是为了突出显示一个特定的日期。演示图像显示在底部。首先,让我们绘制一些数据:

import matplotlib.pyplot as plt

dates = ['2019-10-31', '2019-11-01', '2019-11-02', '2019-11-03']

y = [i*i for i in range(len(dates))] # some random y values

# An arbitrary date value to encircle 
encircled_date = dates[1]
val_of_encircled_date = y[1]

# Plot the graph
fig, ax = plt.subplots()
ax.plot_date(dates,y,'-')
bottom, top = plt.ylim() # Later, we'll need the min value of the y-axis for correct positioning of circle
现在,如果你只想在图表上画一个圆,当它经过你的特定日期时,最简单也是最好的方法就是简单地用markerstyle='o'回复这个特定的值。根据您的喜好调整标记大小、线宽和颜色:

# Plot a circle around specific graph value
ax.plot_date(encircled_date, val_of_encircled_date,
                'og', # marker style 'o', color 'g'
                fillstyle='none', # circle is not filled (with color)
                ms=10.0) # size of marker/circle
然后,如果你想要在日期记号周围画一个圆圈,在你的特定日期的x轴上,根据你需要圈出的细节,这会有点棘手。当然,您可以使用上述方法仅在刻度周围画一个小圆圈,但我将展示一种基于另一种方法的更高级方法:

上面的解决方案仅包围勾号,而不是日期标签本身。通过调整两个偏移参数,我们可以微调圆以适应内部的日期标签

# Plot a circle around the specific date's label on the x-axis
pos_offset = 0.5
len_offset = 0.4
circle2 = plt.Circle((encircled_date, bottom-pos_offset), # position
                    (1.0+len_offset) / len(dates), # radius
                    color='purple',
                    clip_on=False, # allow drawing outside of axis
                    fill=False)
ax.add_artist(circle2)
但是,此调整可能是一项乏味的任务。如果您的目标只是强调这个特定日期,那么最好只是重新配置x标签。例如,您可以像这样更改标签的颜色

ax.get_xticklabels()[2].set_color("red")
ax.get_xticklabels()[2].set_weight("bold")
下图显示了四种不同的方法。我希望这有帮助

最后一句话:当你得到一个人口稠密的x轴日期,它可能是值得研究更先进的格式的日期标签,你可以阅读所有关于在。例如,它们显示了如何整齐地旋转标签,使它们更紧密地结合在一起而不重叠


你想在实际日期、x轴上还是在经过该日期的图表上画一个圆?我不知道你的意思@magnuscan你画了一个简单的绘图/草图,例如在MS Paint中,指定你想要圆的位置?你想在实际日期、x轴上画一个圆,或者在经过该日期的图表上?我不确定您的意思@magnuscan您可以做一个简单的绘图/草图,例如在MS Paint中,指定圆的位置?谢谢@magnus,这是一个很好的开始!x轴应该是我指定的DatetimeIndex,而不是您假设的字符串列表。@user308827,它是为了简化而不是假设。然而,我确实假设你使用的是你的帖子中没有提到或标记的熊猫。我试图解决绘制圆的问题,而不是使用轴上的日期进行绘图的问题。在我看来,这是两个不同的问题,可能应该得到两个不同的职位。如果您提供更多详细信息和创建DatetimeIndex所依据的原始数据,我可能会进一步帮助您。。。。根据,您可能可以执行类似的操作:date_strings=[df_c.index.date中d的strd]来获取我在示例中使用的日期字符串列表。谢谢@magnus,这是一个很好的开始!x轴应该是我指定的DatetimeIndex,而不是您假设的字符串列表。@user308827,这是预期的 作为一种简化,而不是一种假设。然而,我确实假设你使用的是你的帖子中没有提到或标记的熊猫。我试图解决绘制圆的问题,而不是使用轴上的日期进行绘图的问题。在我看来,这是两个不同的问题,可能应该得到两个不同的职位。如果您提供更多详细信息和创建DatetimeIndex所依据的原始数据,我可能会进一步帮助您。。。。根据,您可能可以执行类似的操作:date_strings=[df_c.index.date中d的strd]来获取我在示例中使用的日期字符串列表。