改变yaxis记号标签以最小化混乱,但不显示数据集中观察到的数据点

2024-05-18 23:39:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这只是生成示例可视化的示例代码:


# Importing necessary libraries 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
from dateutil.parser import parse

%matplotlib inline

# Below, I just convert date strings into an actual date object.

date_strings = ['2020-01-20 03:32:44',
'2020-03-26 05:13:07',
'2020-03-26 13:32:09',
'2020-03-26 23:57:49',
'2020-03-27 15:30:00',
'2020-03-28 00:04:32',
'2020-03-28 13:26:15',
'2020-03-29 00:11:22',
'2020-04-02 00:30:00',
'2020-04-06 14:00:00']

dates = []

for date in date_strings:
    dt = parse(date)
    print(dt.date())
    dates.append(dt.date())

# finally making the graph:

x1 = np.array([x for x in range(10)])
x = dates
y = [x+60 for x in range(10)]

plt.xticks(ticks=dates,labels=dates,rotation='30')
plt.plot(x,y)
plt.scatter(x,y)

plt.show()

我得到的是:

img

现在这很棘手,因为大多数传统的固定方法包括在中间包含随机的数据点。例如,2月15日可能会突然出现勾号标签

但是,我不想在没有实际记录数据点的地方包含勾号标签

基本上,对于我的要求,条件似乎有点严格:

  • x轴不能有显示数据中未出现的记号标签。(我能做到)
  • 必须始终显示第一个和最后一个日期。(我也可以这样做)
  • 应该显示之间可以显示而不会在x轴上造成太多混乱的任何日期(这是没有现有解决方案可以帮助我的部分!)

Tags: 数据inimport示例fordatematplotlibparse
1条回答
网友
1楼 · 发布于 2024-05-18 23:39:55

这是我试图解决的问题

免责声明,可能有更好的方法来做到这一点,我只是把一些东西放在一起,看看是否可以减少一些混乱。我不完全理解代码,但我确实实现了一个结果

尽管如此,我还是用这个post提出了一个解决方案,它可以作为有用的资源,更好地解释我的想法

解决方案代码

import numpy as np
import matplotlib.pyplot as plt
from dateutil.parser import parse

date_strings = ['2020-01-20 03:32:44',
'2020-03-26 05:13:07',
'2020-03-26 13:32:09',
'2020-03-26 23:57:49',
'2020-03-27 15:30:00',
'2020-03-28 00:04:32',
'2020-03-28 13:26:15',
'2020-03-29 00:11:22',
'2020-04-02 00:30:00',
'2020-04-06 14:00:00']

dates = []

for date in date_strings:
    dt = parse(date)
    print(dt.date())
    dates.append(dt.date())

x1 = np.array([x for x in range(10)])
x = dates
y = [x+60 for x in range(10)]

plt.xticks(ticks=dates,labels=dates,rotation='90')

#solution starts
N = 10
plt.gca().margins(x=0)
plt.gcf().canvas.draw()
tl = plt.gca().get_xticklabels()
maxsize = max([t.get_window_extent().width for t in tl])
m = 0.01 # inch margin
s = maxsize/plt.gcf().dpi*N+2*m
margin = m/plt.gcf().get_size_inches()[0]

plt.gcf().subplots_adjust(left=margin, right=25.-margin)
plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1])
plt.plot(x,y)
plt.scatter(x,y)

plt.show()

结果图

Uncluttered graph with space between x-axis ticks

注意事项

plt.gcf().subplots_adjust(left=margin, right=25.-margin)

更改right参数将更改x记号的间距。但是,当前的实现需要权衡:

准确性及;间距与图像宽度

数字越小,图像空间占用的宽度越小。但是,图像会失去准确性&;表示打印点的间距

我发现25是一个不错的数字,但代价是昂贵的图像宽度。我不确定这是否会成为一个问题,但我想我会提到它

m

如果单独更改,则对图像宽度的影响很小

数字越小,图像的宽度越小

plt.xticks(ticks=dates,labels=dates,rotation='90')

[R]otation影响图形的间距,类似于right参数

数字越接近与x轴平行,精确度越差&;间距,较便宜的图像宽度

数字越接近与y轴平行,精确度和;间距越大,图像宽度越昂贵

据我所知,原始代码中有30个参数用于旋转。我不确定在解决方案中维护这一点是否重要,但我想我会提到这一点

我希望这有帮助

相关问题 更多 >

    热门问题