如何绘制温度计?

时间:2019-02-20 15:58:51

标签: python matplotlib

在最近非常广泛的question中,有人问如何用matplotlib绘制几个符号,例如“圆形,正方形,矩形,星形,温度计和箱形图”。从该列表中可以看出,除了温度计外,所有其他温度计都很明显,如文档中所示或许多现有的stackoverflow答案中所示。由于OP似乎根本不对热敏仪感兴趣,所以我想在这里问一个专门针对温度计的新问题。

如何在matplotlib中绘制温度计?

原则上,您可以绘制任何喜欢的符号,使其成为markerPath。温度计似乎没有任何unicode符号。 Font awesome有一个温度计符号,并在matplotlib is possible中绘制了FontAwesome符号。但是只有5种不同的馅料

enter image description here

此外,这种字体符号的颜色是统一的,但理想情况下,温度计的内部(汞柱)应使用不同的颜色(出于关联的原因,大部分可能是红色的)或使用不同的颜色也可以用颜色编码温度。

那么可能有一个温度符号,其中汞柱根据颜色和填充水平编码温度(或实际上任何其他量)?如果可以,怎么办?

我在下面给出了一个答案,欢迎对该方法的替代或改进,作为此处的进一步答案。

1 个答案:

答案 0 :(得分:9)

绘制由两部分组成的温度计的一种选择是创建两个Path,分别是外壳和内部汞柱。为此,可以从头开始创建路径,并允许内部路径根据(规范化的)输入参数而变化。

然后可以将两个路径绘制为单独的散点图。在下面的代码中,我们创建一个具有scatter方法的类,该方法的工作方式与通常的scatter相似,不同的是它还会为温度和{{ 1}}用于将温度标准化为输入。

temp

此类的用法如下:

tempnorm

我们绘制了3个温度计,这些温度计通过“汞”柱的填充描绘出不同的温度。由于未进行归一化,因此将import numpy as np import matplotlib.pyplot as plt import matplotlib.path as mpath class TemperaturePlot(): @staticmethod def get_hull(): verts1 = np.array([[0,-128],[70,-128],[128,-70],[128,0], [128,32.5],[115.8,61.5],[96,84.6],[96,288], [96,341],[53,384],[0,384]]) verts2 = verts1[:-1,:] * np.array([-1,1]) codes1 = [1,4,4,4,4,4,4,2,4,4,4] verts3 = np.array([[0,-80],[44,-80],[80,-44],[80,0], [80,34.3],[60.7,52],[48,66.5],[48,288], [48,314],[26.5,336],[0,336]]) verts4 = verts3[:-1,:] * np.array([-1,1]) verts = np.concatenate((verts1, verts2[::-1], verts4, verts3[::-1])) codes = codes1 + codes1[::-1][:-1] return mpath.Path(verts/256., codes+codes) @staticmethod def get_mercury(s=1): a = 0; b = 64; c = 35 d = 320 - b e = (1-s)*d verts1 = np.array([[a,-b],[c,-b],[b,-c],[b,a],[b,c],[c,b],[a,b]]) verts2 = verts1[:-1,:] * np.array([-1,1]) verts3 = np.array([[0,0],[32,0],[32,288-e],[32,305-e], [17.5,320-e],[0,320-e]]) verts4 = verts3[:-1,:] * np.array([-1,1]) codes = [1] + [4]*12 + [1,2,2,4,4,4,4,4,4,2,2] verts = np.concatenate((verts1, verts2[::-1], verts3, verts4[::-1])) return mpath.Path(verts/256., codes) def scatter(self, x,y, temp=1, tempnorm=None, ax=None, **kwargs): self.ax = ax or plt.gca() temp = np.atleast_1d(temp) ec = kwargs.pop("edgecolor", "black") kwargs.update(linewidth=0) self.inner = self.ax.scatter(x,y, **kwargs) kwargs.update(c=None, facecolor=ec, edgecolor=None, color=None) self.outer = self.ax.scatter(x,y, **kwargs) self.outer.set_paths([self.get_hull()]) if not tempnorm: mi, ma = np.nanmin(temp), np.nanmax(temp) if mi == ma: mi=0 tempnorm = plt.Normalize(mi,ma) ipaths = [self.get_mercury(tempnorm(t)) for t in temp] self.inner.set_paths(ipaths) 的温度归一化为最小值和最大值。

enter image description here

或者我们可以使用颜色({plt.rcParams["figure.figsize"] = (5.5,3) plt.rcParams["figure.dpi"] = 72*3 fig, ax = plt.subplots() p = TemperaturePlot() p.scatter([.25,.5,.75], [.3,.4,.5], s=[800,1200,1600], temp=[28,39,35], color="C3", ax=ax, transform=ax.transAxes) plt.show() [28,39,35]来显示温度,如

c

enter image description here