[英]How can I convert from scatter size to data coordinates in matplotlib?
[英]How can I keep the data from being crowded together in matplotlib scatter plot?
我运行我的代码,然后我得到下图。
当我修改图形选项的值时,我得到了我想要的输出。
我应该如何处理我的代码? 如何在代码中设置左右值?
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.