繁体   English   中英

如何防止数据在 matplotlib 散点图中挤在一起?

[英]How can I keep the data from being crowded together in matplotlib scatter plot?

我运行我的代码,然后我得到下图。

图1

当我修改图形选项的值时,我得到了我想要的输出。

图_2

我应该如何处理我的代码? 如何在代码中设置左右值?

from matplotlib import pyplot as plt
import matplotlib.dates as mdate
import pandas as pd 
import numpy as np
import datetime
from decimal import Decimal
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

data =[(datetime.date(2019, 12, 23), Decimal('0.3230'), Decimal('157.89')),
       (datetime.date(2019, 12, 23), Decimal('0.1680'), Decimal('157.74')),  
       (datetime.date(2019, 12, 23), Decimal('0.1440'), Decimal('152.78')),  
       (datetime.date(2019, 12, 24), Decimal('0.1070'), Decimal('157.94')),  
       (datetime.date(2019, 12, 24), Decimal('0.6420'), Decimal('159.81')),   
       (datetime.date(2019, 12, 25), Decimal('0.0980'), Decimal('115.31')),   
       (datetime.date(2019, 12, 26), Decimal('0.0830'), Decimal('122.89')),    
       (datetime.date(2019, 12, 26), Decimal('0.1600'), Decimal('171.88')),   
       (datetime.date(2019, 12, 27), Decimal('0.1710'), Decimal('161.40')),   
       (datetime.date(2019, 12, 30), Decimal('0.0590'), Decimal('161.02')),   
       (datetime.date(2019, 12, 30), Decimal('0.4150'), Decimal('168.19')),   
       (datetime.date(2019, 12, 31), Decimal('0.1150'), Decimal('167.83')),   
       (datetime.date(2020, 1, 2), Decimal('0.0790'), Decimal('192.41')),   
       (datetime.date(2020, 1, 3), Decimal('0.4930'), Decimal('216.43')),   
       (datetime.date(2020, 1, 3), Decimal('0.2640'), Decimal('154.92')),   
       (datetime.date(2020, 1, 3), Decimal('0.1980'), Decimal('211.11')),   
       (datetime.date(2020, 1, 10), Decimal('0.2173'), Decimal('248.64')),   
       (datetime.date(2020, 1, 13), Decimal('1.3202'), Decimal('196.34')),   
       (datetime.date(2020, 1, 14), Decimal('0.0423'), Decimal('198.30')),   
       (datetime.date(2020, 1, 16), Decimal('0.0236'), Decimal('296.56')),   
       (datetime.date(2020, 1, 16), Decimal('0.0937'), Decimal('304.03'))]

df = pd.DataFrame(data)
df.rename(columns={0:'a',1:'b',2:'c'},inplace=True)
x = df.a
y = df.c
fig,ax=plt.subplots()
ax.scatter(x,y,facecolor='g',alpha=0.5)
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
ax.set_xticks(x.drop_duplicates())
fig.autofmt_xdate()
plt.show()

您需要直接使用ax.set_xlim设置 x 轴限制。 您可以从x.drop_duplicates()返回的数据帧中获取最大值和最小值,然后像这样填充一个小的时间增量

# ...
_x = x.drop_duplicates()
ax.set_xticks(_x)
# Create a 2-day timedelta and set the limits from the min and max with td as padding
td = datetime.timedelta(days=2)
ax.set_xlim([min(_x)-td, max(_x)+td])
fig.autofmt_xdate()
plt.show()

这会给你

在此处输入图片说明

我还建议设置一个更广泛的数字,即

fig, ax = plt.subplots(figsize=(10, 5))

哪个会给你

在此处输入图片说明

这是集合自动缩放的不幸结果。 问题是#7413 ,解决方案是#13642 因此,在 matplotlib 3.2 中不会出现该问题。

在此之前,您可以通过添加和删除与散点相同数据的线图来进行手动自动缩放。 即在问题的代码中,将ax.scatter(...)替换为

def myautoscale(sc):
    ax = sc.axes
    x, y= sc.get_offsets().T
    line, = ax.plot(x,y)
    ax.relim()
    ax.autoscale_view()
    line.remove()

sc = ax.scatter(x,y, facecolor='g', alpha=0.5)
myautoscale(sc)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM