Python控制台绘图时标题及坐标轴标签不显示问题求助
问题:Matplotlib在Python控制台中无法显示标题与坐标轴标签
我尝试使用matplotlib绘制不同年龄对应的薪资中位数,代码如下:
from matplotlib import pyplot as plt dev_x = [x for x in range(25, 36)] dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752] plt.plot(dev_x, dev_y) plt.title("Median salary (USD) by age") plt.xlabel("Age") plt.ylabel("Median salary (USD)") plt.show()将代码在PyCharm中作为文件运行时一切正常,但在Python控制台中运行时,标题、X轴和Y轴标签均不显示。具体表现为:输入
plt.plot(dev_x, dev_y)后图表显示,添加标题和坐标轴标签后会出现仅含元素的空图,且plt.show()无任何作用。请问我哪里操作有误?
原因分析
这是因为Python控制台默认开启了matplotlib的交互模式(Interactive Mode),当你分步输入命令时,执行plt.plot()的瞬间,matplotlib就会立刻渲染并显示图表。之后你调用plt.title()、plt.xlabel()这些方法时,实际上是在操作一个新创建的空白Figure对象,而不是已经显示出来的那个图表,所以后续的设置不会生效,最后调用plt.show()自然也看不到任何变化。
解决方法
这里有三种可行的解决方案,你可以根据自己的习惯选择:
1. 一次性执行所有代码
把所有绘图相关的命令复制到控制台中一次性执行,不要分步输入。这样所有的标题、轴标签设置都会在plt.show()之前完成,matplotlib会一次性渲染出完整的图表:
from matplotlib import pyplot as plt dev_x = [x for x in range(25, 36)] dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752] plt.plot(dev_x, dev_y) plt.title("Median salary (USD) by age") plt.xlabel("Age") plt.ylabel("Median salary (USD)") plt.show()
2. 关闭交互模式后分步操作
先在控制台输入命令关闭交互模式,之后再分步执行绘图命令,最后用plt.show()显示完整图表:
plt.ioff() # 关闭交互模式
然后依次输入:
dev_x = [x for x in range(25, 36)] dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752] plt.plot(dev_x, dev_y) plt.title("Median salary (USD) by age") plt.xlabel("Age") plt.ylabel("Median salary (USD)") plt.show() # 此时会显示包含所有元素的完整图表
3. 使用面向对象API(推荐)
这种方式更清晰,显式创建Figure和Axes对象,所有的设置都直接作用于指定的Axes,避免混淆不同的Figure:
from matplotlib import pyplot as plt fig, ax = plt.subplots() # 显式创建Figure和Axes dev_x = [x for x in range(25, 36)] dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752] ax.plot(dev_x, dev_y) ax.set_title("Median salary (USD) by age") ax.set_xlabel("Age") ax.set_ylabel("Median salary (USD)") plt.show()
这种方法不管是在文件中还是交互式控制台里,行为都一致,也更便于复杂图表的扩展。
内容的提问来源于stack exchange,提问作者ptushev




