散点图对数刻度

61
在我的代码中,我对两个数据系列取对数并绘制它们。我想通过将每个刻度值提高到e的幂次方(自然对数的反对数)来更改x轴的每个刻度值。
换句话说,我想绘制这两个系列的对数,但是将x轴显示为级别。

enter image description here

这是我正在使用的代码。

from pylab import scatter
import pylab
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
import numpy as np

file_name = '/Users/joedanger/Desktop/Python/scatter_python.csv'

data = DataFrame(pd.read_csv(file_name))

y = np.log(data['o_value'], dtype='float64')
x = np.log(data['time_diff_day'], dtype='float64')

fig = plt.figure()
plt.scatter(x, y, c='blue', alpha=0.05, edgecolors='none')
fig.suptitle('test title', fontsize=20)
plt.xlabel('time_diff_day', fontsize=18)
plt.ylabel('o_value', fontsize=16)
plt.xticks([-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4])

plt.grid(True)
pylab.show()
2个回答

118

matplotlib 为您进行对数处理:

fig = plt.figure()
ax = plt.gca()
ax.scatter(data['o_value'] ,data['time_diff_day'] , c='blue', alpha=0.05, edgecolors='none')
ax.set_yscale('log')
ax.set_xscale('log')

如果您使用的是相同大小和颜色标记,请使用plot以提高速度。

fig = plt.figure()
ax = plt.gca()
ax.plot(data['o_value'] ,data['time_diff_day'], 'o', c='blue', alpha=0.05, markeredgecolor='none')
ax.set_yscale('log')
ax.set_xscale('log')

@tcaswell 我在使用 plt.scatter() 后无法使用 plt.yscale('log'),并已在此问题中描述了问题。 - uhoh
ax.set_yscale('log') 使用 np.log 还是 np.log1p 进行转换? - Aviad Rozenhek

44

接受的答案有点过时。至少pandas 0.25原生支持对数坐标轴:

# logarithmic X
df.plot.scatter(..., logx=True)
# logarithmic Y
df.plot.scatter(..., logy=True)
# both
df.plot.scatter(..., loglog=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接