аргумент pandas.plot c против s - PullRequest
       1

аргумент pandas.plot c против s

0 голосов
/ 19 сентября 2018

У меня есть следующий код из книги машинного обучения на python:

copy_set.plot(kind = "scatter" , x = "longitude" , 
              y = "latitude" , alpha = 0.4 , 
              s = copy_set[ "population" ], 
              label = "population" , figsize=(10,7), 
              c = "median_house_value" , cmap = plt.get_cmap ( "jet" ) ) 

median_house_value и population - это два столбца в кадре данных copy_set.Я не понимаю, почему для аргумента s я должен использовать copy_set['population'], но для аргумента c можно использовать только имя столбца median_house_value.Когда я пытаюсь использовать только имя столбца для параметра s, я получаю сообщение об ошибке:

TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

1 Ответ

0 голосов
/ 19 сентября 2018

Очень хороший вопрос.df.plot - это оболочка для нескольких функций построения графиков в matplotlib.Для kind="scatter" будет вызываться функция scatter matplotlib.Большинство аргументов df.plot() сначала преобразуются в данные внутри Series, которые вы получаете из столбца данных соответствующего имени.

Например,

df.plot(x="lon", y="lat")

будет преобразовано в

ax.scatter(x=df["lon"].values, y=df["lat"].values)

Остальные аргументы передаются в Scatter, следовательно,

df.plot(x="lon", y="lat", some_argument_pandas_doesnt_know=True)

приведет к

ax.scatter(x=df["lon"].values, y=df["lat"].values, some_argument_pandas_doesnt_know=True)

Таким образом, хотя pandas преобразует th аргументы x, y, c, для s это не так.Следовательно, s просто передается в ax.scatter, но эта функция matplotlib не знает, что будет означать какая-то строка типа "population".
Для аргументов, передаваемых в функцию matplotlib, нужно придерживатьсяПодпись matplotlib и в случае s предоставляют данные напрямую.

Обратите внимание, однако, что сам разброс matplotlib также позволяет использовать строки в качестве аргументов.Однако для этого необходимо указать, из какого набора данных они должны быть взяты.Это делается с помощью аргумента data.Следовательно, следующее работает хорошо и будет matplotlib эквивалентным вызову панд в вопросе:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np; np.random.seed(42)

df = pd.DataFrame(np.random.rand(20,2), columns=["lon", "lat"])
df["pop"] = np.random.randint(5,300,size=20)
df["med"] = np.random.rand(20)*1e5

fig, ax = plt.subplots(figsize=(10,7))
sc = ax.scatter(x = "lon", y = "lat", alpha = 0.4, 
                s = "pop", label = "population" , 
                c = "med" , cmap = "jet", data=df)
fig.colorbar(sc, label="med")
ax.set(xlabel="longitude", ylabel="latitude")

plt.show()

Наконец, вы можете теперь спросить, не будет ли в равной степени возможна подача данных в matplotlib через аргумент dataпроходя через пандуК сожалению, нет, потому что pandas использует data в качестве аргумента внутри себя, так что он не будет пропущен.Поэтому у вас есть два варианта:

  1. Используйте pandas, как в вопросе, и поставьте сами данные через аргумент s вместо имени столбца.
  2. Используйте matplotlib, как показано здесь, ииспользуйте имена столбцов для всех аргументов.(Или используйте сами данные, которые вы чаще всего видите при просмотре кода matplotlib.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...