我正在做一个水平条形图,但挣扎于调整ylim,或者可能是另一个参数,使我的标签更清晰,使所有的标签适合y轴。我玩了一下ylim和文本大小可以更大或更小,但条形不适合y轴。有什么正确的方法吗?
我的代码:
import matplotlib.pyplot as plt #we load the library that contains the plotting capabilities
from operator import itemgetter
D=[]
for att, befor, after in zip(df_portion['attributes'], df_portion['2005_2011 (%)'], df_portion['2012_2015 (%)']):
i=(att, befor, after)
D.append(i)
Dsort = sorted(D, key=itemgetter(1), reverse=False) #sort the list in order of usage
attri = [x[0] for x in Dsort]
aft = [x[1] for x in Dsort]
bef = [x[2] for x in Dsort]
ind = np.arange(len(attri))
width=3
ax = plt.subplot(111)
ax.barh(ind, aft, width,align='center',alpha=1, color='r', label='from 2012 to 2015') #a horizontal bar chart (use .bar instead of .barh for vertical)
ax.barh(ind - width, bef, width, align='center', alpha=1, color='b', label='from 2005 to 2008') #a horizontal bar chart (use .bar instead of .barh for vertical)
ax.set(yticks=ind, yticklabels=attri,ylim=[1, len(attri)/2])
plt.xlabel('Frequency distribution (%)')
plt.title('Frequency distribution (%) of common attributes between 2005_2008 and between 2012_2015')
plt.legend()
plt.show()
这是上面代码的绘图
1条答案
按热度按时间bwleehnv1#
要使标签适合,您需要设置较小的fontsize,或使用较大的figsize。更改
ylim
将只显示条形图的子集(如果ylim
设置得太窄),或者将显示更多的空白(当ylim
更大时)。代码中最大的问题是
width
太大。宽度的两倍需要适合1.0
的距离(刻度通过ind
放置,这是一个数组0,1,2,...
)。由于matplotlib将水平条形图的厚度称为“height”,因此在下面的示例代码中使用了这个名称。使用align='edge'
可以直接定位条形图(align='center'
将移动条形图一半的“高度”)。Pandas有简单的函数来根据一行或多行对 Dataframe 进行排序。
代码来说明这些想法:
seaborn库有一些函数可以创建每个属性具有多个条形的条形图,而无需手动调整条形位置。Seaborn更喜欢“长格式”的数据,可以通过pandas的
melt()
创建。示例代码: