在进行数据分析时,我使用pandas Dataframe的df.plot.bar方法绘制结果:
df.plot.bar(figsize=(15, 5), legend=None)
在进行更多研究时,我注意到在某些情况下这些图看起来有所不同。原因是,当figsize太小时,plot.bar方法开始忽略信息。
我的示例中每个事件有31个小节,在figsize=(10, 5)
处绘制的小节比在figsize(15, 5)
中少。
这是已知的和期望的行为吗?因为在没有警告的情况下,情节错过了(重要的)信息。
数据框:
Day(X-Axis in plot)
+------------+-----------------------+
| Id + Day1 | Day2 | Day3 ...
+------------+-----------------------+
| 0 + 0 | 20 | 0
| 1 | 300 | 10 | 400
| 3 + 20 | 0 | 400
| 4 | 60 | 0 | 800
...
+------------+-----------------------+
值是在特定日期特定ID的填充。
每个id每天都有自己的栏。数据框会与T换位,以绘制图。条形图在X轴上绘制日期。
figsize=(10, 5)
figsize(15, 5)
答案 0 :(得分:2)
作为一个估计:您有12行31列。酒吧占据了单位面积的80%。该条至少应有两个像素宽才能在屏幕上看到。通常的数字在轴的两侧都有10%的边距,并且具有100 dpi。然后您需要2 * 12 * 31 / 0.8 ** 2/100〜= 12英寸的图形宽度。换句话说,如果您有超过31列,则在12英寸宽的图形上可能看不到一些条形图。
为使此结果可重复,让我们考虑以下情况,其中有N=20
行和列。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame(np.diag(np.ones(N)))
ax = df.plot.bar(legend=False)
plt.show()
有些栏不可见。我们可以计算出,对于20行20列,图形的宽度需要为2*N**2/0.8**2/100. == 12.5
英寸。
N=20
df = pd.DataFrame(np.diag(np.ones(N)))
w = 2*N**2/0.8**2/100.
plt.rcParams.update({"figure.figsize" : (w, 4.8), "figure.dpi" : 100})
ax = df.plot.bar(legend=False)
现在它确实显示了所有条形图。
当然不能将图形任意大,因此可以确保横条具有边缘线,该边缘线的绘制与矩形的范围无关。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame(np.diag(np.ones(N)))
ax = df.plot.bar(legend=False)
for bar in ax.patches:
bar.set_linewidth(0.72)
bar.set_edgecolor(bar.get_facecolor())
plt.show()