从列表中读取标签时,我不知道如何设置 multi-line xticklabels - matplotlib
I can't figure out how to set multi-line xticklabels when reading labels from a list - matplotlib
如标题所示,当我从两个单独的列表中读取时,我无法找到任何关于如何将 multi-line xticklabels 打印到我的图表上的文档。我听说过关于如何制作一个单独的不可见 x-axis 然后设置第二行标签的理论,但我还没有看到任何代码可以解释如何完成。想法?谢谢你的时间。
from inventoryClass import stockItem
import numpy as np
import matplotlib.pyplot as plt
def plotInventory(itemRecords) :
stockBegin = []
stockFinish = []
stockID = []
stockItems = []
for rec in itemRecords.values() :
stockBegin.append(rec.getStockStart())
stockFinish.append(rec.getStockOnHand())
stockID.append(rec.getID())
stockItems.append(rec.getName())
N = len(stockBegin)
tuple(stockBegin)
tuple(stockFinish)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars
fig, ax = plt.subplots()
rects1 = ax.bar(ind, stockBegin, width, color='r')
rects2 = ax.bar(ind + width, stockFinish, width, color='c')
ymax = ax.get_ylim()
ax.set_ylim(0, (max(ymax) + 30))
# add some text for labels, title and axes ticks
ax.set_ylabel('Inventory')
ax.set_title('Stock start and end inventory, by item')
ax.set_xticks(ind + width)
ax.set_xticklabels(stockItems)
ax.set_xticklabels(stockID)
ax.legend((rects1[0], rects2[0]), ('Start', 'End'))
def autolabel(rects) :
for rect in rects :
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,
'%d' % int(height),
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
plt.show()
我在这里尝试完成的示例:
用换行符加入你的两个列表。您可以将列表传递给 ax.set
.
import matplotlib.pyplot as plt
xlab1 = [ "a", "b", "c"]
xlab2 = ["1", "2", "3"]
xlabels = [f"{x1}\n{x2}" for x1, x2, in zip(xlab1,xlab2)]
fig, ax = plt.subplots()
_ = ax.bar([0, 3, 6], range(3), width=1)
_ = ax.bar([1, 4, 7], range(3), width=1)
_ = ax.set(xticks=[.5, 3.5, 6.5], xticklabels=xlabels)
如标题所示,当我从两个单独的列表中读取时,我无法找到任何关于如何将 multi-line xticklabels 打印到我的图表上的文档。我听说过关于如何制作一个单独的不可见 x-axis 然后设置第二行标签的理论,但我还没有看到任何代码可以解释如何完成。想法?谢谢你的时间。
from inventoryClass import stockItem
import numpy as np
import matplotlib.pyplot as plt
def plotInventory(itemRecords) :
stockBegin = []
stockFinish = []
stockID = []
stockItems = []
for rec in itemRecords.values() :
stockBegin.append(rec.getStockStart())
stockFinish.append(rec.getStockOnHand())
stockID.append(rec.getID())
stockItems.append(rec.getName())
N = len(stockBegin)
tuple(stockBegin)
tuple(stockFinish)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars
fig, ax = plt.subplots()
rects1 = ax.bar(ind, stockBegin, width, color='r')
rects2 = ax.bar(ind + width, stockFinish, width, color='c')
ymax = ax.get_ylim()
ax.set_ylim(0, (max(ymax) + 30))
# add some text for labels, title and axes ticks
ax.set_ylabel('Inventory')
ax.set_title('Stock start and end inventory, by item')
ax.set_xticks(ind + width)
ax.set_xticklabels(stockItems)
ax.set_xticklabels(stockID)
ax.legend((rects1[0], rects2[0]), ('Start', 'End'))
def autolabel(rects) :
for rect in rects :
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,
'%d' % int(height),
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
plt.show()
我在这里尝试完成的示例:
用换行符加入你的两个列表。您可以将列表传递给 ax.set
.
import matplotlib.pyplot as plt
xlab1 = [ "a", "b", "c"]
xlab2 = ["1", "2", "3"]
xlabels = [f"{x1}\n{x2}" for x1, x2, in zip(xlab1,xlab2)]
fig, ax = plt.subplots()
_ = ax.bar([0, 3, 6], range(3), width=1)
_ = ax.bar([1, 4, 7], range(3), width=1)
_ = ax.set(xticks=[.5, 3.5, 6.5], xticklabels=xlabels)