Sometimes you have to show positive, zero and negative number in log scale. However you cannot take log of negative numbers and zero. But one could approximate it with a log transform modulus as stated here.

In Python with numpy:

from numpy import sign, abs, log10

import matplotlib.pyplot as plt

# Data varies in several magnitudes and has both positive, zero and negative numbers

x = [-10000,-1000,-100,-10,0,10,100,1000,10000]

# log modulus transform

x_log_modulus_transform= sign(x)*(log10(abs(x)+1))

f, ax = plt.subplots(2, sharex=True)

ax[0].plot(x,'o')

ax[0].margins(x=0.12, y=0.2) # for better visualization of datapoints at the end of axis

ax[1].plot(x_log_modulus_transform,'o')

ax[1].margins(x=0.12, y=0.2) # for better visualization of datapoints at the end of axis

ax[0].set_ylabel('x')

ax[1].set_ylabel('sign(x)*(log(|x|+1))')

plt.show()

import matplotlib.pyplot as plt

# Data varies in several magnitudes and has both positive, zero and negative numbers

x = [-10000,-1000,-100,-10,0,10,100,1000,10000]

# log modulus transform

x_log_modulus_transform= sign(x)*(log10(abs(x)+1))

f, ax = plt.subplots(2, sharex=True)

ax[0].plot(x,'o')

ax[0].margins(x=0.12, y=0.2) # for better visualization of datapoints at the end of axis

ax[1].plot(x_log_modulus_transform,'o')

ax[1].margins(x=0.12, y=0.2) # for better visualization of datapoints at the end of axis

ax[0].set_ylabel('x')

ax[1].set_ylabel('sign(x)*(log(|x|+1))')

plt.show()