彩色对数图:去除10个标签的幂

时间:2019-07-30 14:40:37

标签: python matplotlib

我一直在寻找以下相关问题: Matplotlib: disable powers of ten in log plot

Prevent axes from being in scientific notation (powers of 10) using matplotlib in Python on semilogy plot

但是,两者都无法真正帮助我。 我实质上是在用关联的颜色图制作一个相当简单的散点图,但是我似乎无法摆脱y轴上10个标签的作用。这是我的代码和结果图。 'teff','lum'和'col1'都是dtype('float64')的系列,我已经在单独的函数中定义了颜色图'rvb'。

plt.figure(figsize=(12,6))
plt.scatter(teff,lum,s=10,c=col1, cmap=rvb)
plt.yscale('log')
plt.colorbar()
axes = plt.gca()
plt.gca().invert_xaxis()
plt.xlabel('Effective Temperature [K]')
plt.ylabel('Luminosity [L$_{\odot}$]')
plt.show()

Current Scatter Plot

我尝试了在类似问题中发现的以下解决方案的几种变体

from matplotlib.ticker import ScalarFormatter
ax.get_yaxis().get_major_formatter().set_useOffset(False)

但是我只是遇到错误,例如“ LogFormatterSciNotation”对象没有属性“ set_useOffset”。

我也尝试过使用子图解决问题,但是后来我无法使颜色图正常工作。我希望找到一种解决方案,使我的图保持几乎相同,只是将10的幂更改为实际数字,并在可能的情况下设置更规则的间隔。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是使用轴对象的工作版本:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

from matplotlib.ticker import ScalarFormatter

x = [i for i in range(10)]
y = [i for i in range(10)]
z =  [i for i in range(20,30)]

fig = plt.figure(figsize=(12,6))
ax = plt.gca()

my_cmap = cm.jet
scatter_plot = ax.scatter(x, y, s=30, cmap=my_cmap, c=z)

m = cm.ScalarMappable(cmap=my_cmap)
m.set_array(np.array(z))
plt.colorbar(m)

ax.set_yscale('log')
ax.set_xlabel('Effective Temperature [K]')
ax.set_ylabel('Luminosity [L$_{\odot}$]')
ax.yaxis.set_major_formatter(ScalarFormatter())

plt.show()

在弄乱格式化程序时,您有一个正确的主意:将y轴设置为对数刻度时,格式化程序切换为LogFormatter,所以我又切换回ScalarFormatter

关于颜色条,我将其传递给ax.scatter调用,然后使用它:

m.set_array(np.array(z))
plt.colorbar(m)

通过这种方式,我在z数组和颜色之间创建了一个映射:第一个值将对应于底部的颜色,依此类推。我将其与z列一起传递给颜色栏,仅此而已。您可以在这里找到更多信息:https://matplotlib.org/3.1.1/api/cm_api.html

只有一件事:文档说颜色范围(这里是z)通常必须在[0,1]之内。在这里它可以工作,但是您可能需要标准化以防万一。

编辑:正如@ImportanceOfBeingErnest所指出的那样,散点图也是标量可映射的,因此您也可以使用它:

scatter_plot.set_array(np.array(z))
plt.colorbar(scatter_plot)

答案 1 :(得分:-1)

快速解决方案:您可以使用plt.yticks()获取刻度和标签,然后将标签替换为空字符串。尝试添加以下行:

locs, labels = plt.yticks()
plt.yticks(locs, ['' for label in labels])

或者,更改字体颜色:

plt.tick_params(axis='y', labelcolor='white')