我正在学习numpy。我希望绘制普朗克定律的不同温度图,因此温度和波长分别为np.array
,T
和l
。
import scipy.constants as sc
import numpy as np
import matplotlib.pyplot as plt
lhinm = 10000 # Highest wavelength in nm
T = np.linspace(200, 1000, 10) # Temperature in K
l = np.linspace(0, lhinm*1E-9, 101) # Wavelength in m
labels = np.linspace(0, lhinm, 6) # Axis labels giving l in nm
B = (2*sc.h*sc.c**2/l[:, np.newaxis]**5)/(np.exp((sc.h*sc.c)/(T*l[:, np.newaxis]*sc.Boltzmann))-1)
for ticks in [True, False]:
plt.plot(B)
plt.xlabel("Wavelength (nm)")
if ticks:
plt.xticks(l, labels)
plt.title("With xticks()")
plt.savefig("withticks.png")
else:
plt.title("Without xticks()")
plt.savefig("withoutticks.png")
plt.show()
我想用x波长标记x轴。如果我不调用plt.xitcks()
,x轴上的标签似乎是数组B的索引(包含计算值)。
我已经看到了答案7559542,但是当我打电话给plt.xticks()
时,所有的值都在轴的左侧被碾碎,而不是沿着它平均分布。
那么定义我自己的一组值(在这种情况下是l
中的值的子集)并将它们放在轴上的最佳方法是什么?
答案 0 :(得分:3)
问题在于您没有将波长值提供给plt.plot()
,因此Matplotlib将索引作为默认值放在水平轴上的数组中。快速解决方案:
plt.plot(l, B)
如果没有明确设置刻度标签,那就是:
当然,此图中横轴上的值实际上是以米为单位,而不是纳米(尽管有标签),因为您作为plot()
的第一个参数传递的值(即数组{{1以米为单位。这就是l
的用武之地。双参数版本xticks(locations, labels)
将标签放在x轴上的相应位置。例如,xticks()
会在x = 1的位置放置一个标签“1”,如果该位置在图中。
但是,它不会更改轴上显示的范围。在您的原始示例中,您对xticks([1], 'one')
的调用在坐标上放置了一堆标签,例如10 -9 ,但它没有更改轴范围,仍然是0到100。不知道所有的标签都被挤压到了左边。
您需要做的是使用您要放置标签的点和标签的所需文本来调用xticks()
。你的方式xticks()
会有效,除了xticks(l, labels)
长度为101且l
长度为6,因此它只使用labels
的前6个元素。要解决这个问题,您可以执行类似
l
其中乘以plt.xticks(labels * 1e-9, labels)
将纳米(您想要显示的内容)转换为米(这是Matplotlib在图中实际使用的坐标)。
答案 1 :(得分:3)
您可以将fn_agg(dt, var_list, var_name_list, by_var_list, order_var_list)
值提供给x
,让matplotlib负责设置刻度标签。
在您的情况下,您可以绘制plt.plot
,但是您仍然以m为单位,而不是nm。
因此,您可以在绘图之前(或在绘图期间)将plt.plot(l, B)
数组转换为nm。这是一个有效的例子:
l
答案 2 :(得分:0)
您需要在PRINT-LINE
使用相同的尺寸列表。尝试将曲线值与曲线值分开设置,如下所示。
xtick