2016-05-02 3 views
0

У меня есть Сиборн Heatmap, и я использую mpldatacursor показать аннотации на площадях, в этом случае ось х координат: enter image description herePython формат строка со смещением

Я показываю зависание подсказку через следующая строка:

datacursor(hover=True, axes = self.axh, formatter = "Value: {x:.0f}".format) 

проблема заключается в том, мои данные начинается в 70, а индекс х-ось Тепловая карта начинается с 0, поэтому значение в изображении 7. То, что я пытался сделать заключается в том, чтобы найти способ «добавить» смещение к значению, чтобы я получил правильное значение, которое равно 77. Я попробовал fo llowing:

formatter = str(eval(str("{x:.0f}".format) + "70")).format

Но это не работает ... как я могу это сделать?

ответ

1

Это должно работать:

formatter = lambda **d: "Value: {:.0f}".format(d["x"] + 70) 

Так что проблема была до того, что я не понимаю, что должно быть предусмотрено в formatter аргумента. Причина, по которой коды примеров показывают, что выглядит неправильным использованием format, объясняется тем, что форматер фактически вызывает функцию (или в этом случае метод) со словарным аргументом. Таким образом, это превращается в нечто вроде этого:

d = {x:123} # this is just to show what d is, it's not part of the code 
"Value: {x:.0f}".format(d) 

Аргумент добавляется к нему. Но чтобы изменить содержимое словаря, вам нужно использовать лямбда, которая принимает dict, а затем распаковывает его с необходимой модификацией. Мы берем значение с помощью ключа "x" и добавляем к нему 70.
Эти звезды до d должны формировать словарь из заданных аргументов ключевого слова. Таким образом, функция f(**d), вызванная так: f(a=1, b=2, c=3) будет иметь словарь d с парами key:value из аргументов: {"a":1, "b":2, "c":3}. Это позволяет функции принимать любое количество аргументов и иметь их все хорошо хранимые в словаре для вас.

+0

спасибо @ Leva7, но он не работает, я получаю ошибку: 'TypeError: () получил неожиданный аргумент ключевого слова 'label'' – MrPedru22

+1

@ MrPedru22 проверить это, я думаю, что это может быть правильно сейчас. – Leva7

1

Похоже, вы неправильно набираете формат. Вам нужно указать, что именно вы форматируете. Вот пример:

val = 7 
out = '{:0f}'.format(val) 

Это дает:

'7.000000' 

Если вы пытаетесь использовать, чтобы добавить 70, вы можете попробовать это:

val = 7 
out = str(float('{:0f}'.format(val)) + 70) 

, который дает:

'77.0' 

Наконец, превратив это в ла mbda:

formatter = lambda x: str(float('{:0f}'.format(x)) + 70) 
formatter(7) 
>> '77.0' 

Надеюсь, это то, что вам нужно.

+0

спасибо @stackunderflow, но он тоже не работает, я получаю ту же ошибку, что и в @ Leva7 answer: 'TypeError: () получил неожиданный ключевой аргумент 'label'' – MrPedru22

+1

@ MrPedru22: Я думаю, это может быть ваш вопрос. Обратите внимание, что лямбда-функцию можно рассматривать как любую регулярную функцию.В следующем случае «x» - ожидаемый входной параметр: 'a = lambda x: x + 1' , и если вы затем попытаетесь вызвать функцию a на значение« 2 », оно должно вернуть« 3 » 'a (2) >> 3' Теперь, если вы попытаетесь назвать ввод, он может упасть, если он не совпадает. 'a (label = 2) ТипError: () получил неожиданное ключевое слово аргумент 'label'' Существует два решения. Первое заключается в том, чтобы просто выполнить функцию: 'a = метка лямбда: ярлык + 1' или просто передать значение вместо вместо его наброски: ' a (2) > 3' – stackunderflow

Смежные вопросы