python - 当宽度<1.0 时 Matplotlib 每周条太细,宽度>=1.0 时太粗
问题描述
为什么我的酒吧这么薄?我尝试将宽度设置为 1,它们变得非常厚。我不确定还能尝试什么。默认厚度是 0.8,这是应该的样子吗?
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np
working_runs = pd.DataFrame(np.random.uniform(1, 2, 210),
columns=['distance'],
index=pd.date_range('2019-06-01', periods=210, freq='D'))
summed = working_runs['distance'].resample('W').sum()
df = pd.DataFrame(summed)
fig, ax = plt.subplots()
ax.bar(df.index, df.distance)
ax.set_xticks(df.index)
ax.xaxis.set_major_formatter(mdates.DateFormatter("%B %d"))
ax.xaxis.set_minor_formatter(mdates.DateFormatter("%B %d"))
plt.xticks(rotation=90)
fig = ax.get_figure()
fig.set_figheight(10)
fig.set_figwidth(12)
plt.title('2019 Weekly Running Miles')
plt.ylabel('Distance /m')
fig.savefig("output.png")
我试着像这样改变它:
ax.bar(df.index, df.distance,width=1)
0.9 看起来没有任何不同,1.0 看起来像这样:
解决方案
我可以确认奇怪的行为,当将宽度设置为小于 1.0 时,它似乎被解释为一天的宽度。将其设置为 1.0 或更高时,它被解释为一周的宽度。
pandas 和 matplotlib 如何协同工作似乎是一个问题。
一种解决方法可能是使用edgecolor
as in ax.bar(df.index, df.distance, width=1, edgecolor='white')
,如下所示:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
working_runs = pd.DataFrame(np.random.uniform(1, 2, 210),
columns=['distance'],
index=pd.date_range('2019-06-01', periods=210, freq='D'))
summed = working_runs['distance'].resample('W').sum()
df = pd.DataFrame(summed)
fig, ax = plt.subplots()
ax.bar(df.index, df.distance, width=1, edgecolor='white')
ax.xaxis.set_major_formatter(mdates.DateFormatter("%B %d"))
ax.xaxis.set_major_locator(mdates.DayLocator(interval=7))
ax.autoscale(enable=True, axis='x', tight=True)
plt.xticks(rotation=90)
plt.title('2019 Weekly Running Miles')
plt.ylabel('Distance /m')
plt.show()
我尝试使用df.plot.bar(y='distance', width=0.9, ax=ax)
. 格式化日期可以通过将 显式转换index
为标签列表来完成。width=1
同样在这种情况下,使用and的情节看起来会更好edgecolor='white'
。
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import pandas as pd
import numpy as np
working_runs = pd.DataFrame(np.random.uniform(1, 2, 210),
columns=['distance'],
index=pd.date_range('2019-06-01', periods=210, freq='D'))
summed = working_runs['distance'].resample('W').sum()
df = pd.DataFrame(summed)
fig, ax = plt.subplots()
df.plot.bar(y='distance', width=0.9, ax=ax)
plt.xticks(range(len(df.index)),
[t.to_pydatetime().strftime("%b %d") for t in df.index],
rotation=90)
plt.title('2019 Weekly Running Miles')
plt.ylabel('Distance /m')
plt.show()
推荐阅读
- amazon-web-services - Apache-spark - 从带有冰川对象的 aws-s3 存储桶中读取数据
- pentaho - Pentaho 大源表处理到目标表相同模式
- resilience4j - 为什么 Resilience4j 断路器不启动新线程
- apache-kafka - Kafka-MongoDB Debezium 连接器:分布式模式
- apache-spark - 如何将火花数据框减少到列中每个值的最大行数?
- css - 背景不会垂直调整大小
- onesignal - 通过rest api将图像添加到oneSignal中的推送通知
- node.js - 在 fetch/ajax 请求后向用户闪烁错误或成功消息
- android - android检索到无效的电话号码
- mysql - if - else 在一个查询中进行多次更新