在numpy / matplotlib.plot中设置轴值

时间:2016-08-24 11:51:23

标签: python numpy matplotlib

我正在学习numpy。我希望绘制普朗克定律的不同温度图,因此温度和波长分别为np.arrayTl

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的索引(包含计算值)。

Without ticks

我已经看到了答案7559542,但是当我打电话给plt.xticks()时,所有的值都在轴的左侧被碾碎,而不是沿着它平均分布。

With ticks

那么定义我自己的一组值(在这种情况下是l中的值的子集)并将它们放在轴上的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

问题在于您没有将波长值提供给plt.plot(),因此Matplotlib将索引作为默认值放在水平轴上的数组中。快速解决方案:

plt.plot(l, B)

如果没有明确设置刻度标签,那就是:

plot with proper values on x axis

当然,此图中横轴上的值实际上是以米为单位,而不是纳米(尽管有标签),因为您作为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在图中实际使用的坐标)。

fixed plot with proper labels

答案 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

enter image description here

答案 2 :(得分:0)

您需要在PRINT-LINE使用相同的尺寸列表。尝试将曲线值与曲线值分开设置,如下所示。

xtick