首页 > 解决方案 > 当宽度<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 看起来像这样:

较粗的线条

标签: pythonpandasmatplotlib

解决方案


我可以确认奇怪的行为,当将宽度设置为小于 1.0 时,它似乎被解释为一天的宽度。将其设置为 1.0 或更高时,它被解释为一周的宽度。

pandas 和 matplotlib 如何协同工作似乎是一个问题。

一种解决方法可能是使用edgecoloras 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()

熊猫 plot.bar 的示例


推荐阅读