簡體   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